Yes, at present lldb isn't too careful to limit the work it does in the SIGINT handler. In this case, lldb is handling stdin for the target process, so the ^C should cause the target to be halted. The current code is actually trying to execute the Halt in the signal handler.
Note, the Driver's Interrupt IO handler tries to be a little better, calling Process::AsyncInterrupt which just sends an eBroadcastBitInterrupt event to the process. Note, however, that this actually requires a bunch more work than should be done in a signal handler (lock the event mutex, and new up an Event, putting it in a std::vector, etc.) But we might get away with that on FreeBSD more easily. I checked in that change, see if that gets you any further. To fix this really pedantically, we'd have to add a thread that was watching for interrupts, so that AsyncInterrupt could message it with something safe like writing to a pipe the interrupt thread was selecting on, and it would in turn wake up the process. That's a bit more work than I have time to do on this right now, especially since we haven't had any reports of this causing problems in real life... Jim On Jun 18, 2013, at 2:19 PM, Ed Maste <[email protected]> wrote: > I can now launch my inferior process on FreeBSD, but fail to get a > notification at process termination and then lldb waits indefinitely. > Upon hitting ^C I get an abort from an assertion in the thread library > "Fatal error 'thread was already on queue.'" It looks to come from > calling non-async-signal-safe pthread_cond_timedwait from the signal > handler: > > #1 0x0000000805ef756c in abort () at > /home/emaste/src/9/lib/libc/stdlib/abort.c:65 > #2 0x0000000800850d2c in _thread_exit (fname=<value optimized out>, > lineno=<value optimized out>, msg=<value optimized out>) > at /home/emaste/src/9/lib/libthr/thread/thr_exit.c:182 > #3 0x000000080084fc1d in cond_wait_common (cond=<value optimized > out>, mutex=<value optimized out>, abstime=<value optimized out>, > cancel=<value optimized out>) at > /home/emaste/src/9/lib/libthr/thread/thr_cond.c:222 > #4 0x00000008013d3995 in lldb_private::Condition::Wait > (this=0x7ffffedf5d20, mutex=@0x7ffffedf5d18, abstime=0x7ffffedf5c58, > timed_out=0x7ffffedf5a1f) at > ../tools/lldb/source/Host/common/Condition.cpp:89 > #5 0x00000008013d213d in > lldb_private::Predicate<bool>::WaitForValueEqualTo > (this=0x7ffffedf5d10, value=true, abstime=0x7ffffedf5c58, > timed_out=0x7ffffedf5a1f) at Predicate.h:338 > #6 0x000000080143e105 in > lldb_private::Listener::WaitForEventsInternal (this=0x7ffffedf5cb8, > timeout=0x7ffffedf5c58, broadcaster=0x0, > broadcaster_names=0x0, num_broadcaster_names=0, event_type_mask=0, > event_sp=@0x7ffffedf5ca8) at > ../tools/lldb/source/Core/Listener.cpp:433 > #7 0x000000080143e4b1 in lldb_private::Listener::WaitForEvent > (this=0x7ffffedf5cb8, timeout=0x7ffffedf5c58, > event_sp=@0x7ffffedf5ca8) > at ../tools/lldb/source/Core/Listener.cpp:481 > #8 0x0000000801747729 in lldb_private::Process::Halt > (this=0x806dbe800, clear_thread_plans=false) > at ../tools/lldb/source/Target/Process.cpp:3389 > #9 0x000000080174bdb8 in > lldb_private::Process::ProcessInputReaderCallback (baton=0x806dbe800, > reader=@0x806feef40, > notification=lldb::eInputReaderInterrupt, bytes=0x0, bytes_len=0) > at ../tools/lldb/source/Target/Process.cpp:4540 > #10 0x0000000801435cdc in lldb_private::InputReader::Notify > (this=0x806feef40, notification=lldb::eInputReaderInterrupt) > at ../tools/lldb/source/Core/InputReader.cpp:349 > #11 0x0000000801408901 in > lldb_private::Debugger::DispatchInputInterrupt (this=0x806c24800) at > ../tools/lldb/source/Core/Debugger.cpp:866 > #12 0x00000008012bc165 in lldb::SBDebugger::DispatchInputInterrupt > (this=0x7fffffffd3d8) at ../tools/lldb/source/API/SBDebugger.cpp:833 > #13 0x0000000000410a44 in sigint_handler (signo=2) at > ../tools/lldb/tools/driver/Driver.cpp:1672 > #14 0x000000080084b62b in handle_signal (actp=<value optimized out>, > sig=<value optimized out>, info=<value optimized out>, > ucp=<value optimized out>) at > /home/emaste/src/9/lib/libthr/thread/thr_sig.c:239 > #15 0x000000080084b1bf in thr_sighandler (sig=2, info=<value optimized > out>, _ucp=<value optimized out>) > at /home/emaste/src/9/lib/libthr/thread/thr_sig.c:182 > #16 0x00007ffffffff003 in ?? () > #17 0x000000080084b090 in sigaction () at > /home/emaste/src/9/lib/libthr/thread/thr_sig.c:580 > #18 0x000000080084fad5 in cond_wait_common (cond=<value optimized > out>, mutex=0x806d646f0, abstime=0x0, cancel=1) > at /home/emaste/src/9/lib/libthr/thread/thr_cond.c:243 > #19 0x00000008013d39b2 in lldb_private::Condition::Wait > (this=0x806dbeaa8, mutex=@0x806dbeaa0, abstime=0x0, > timed_out=0x7ffffedf6bcf) > at ../tools/lldb/source/Host/common/Condition.cpp:92 > #20 0x00000008013d213d in > lldb_private::Predicate<bool>::WaitForValueEqualTo (this=0x806dbea98, > value=true, abstime=0x0, > timed_out=0x7ffffedf6bcf) at Predicate.h:338 > #21 0x000000080143e105 in > lldb_private::Listener::WaitForEventsInternal (this=0x806dbea40, > timeout=0x0, broadcaster=0x0, broadcaster_names=0x0, > num_broadcaster_names=0, event_type_mask=0, > event_sp=@0x7ffffedf6e78) at > ../tools/lldb/source/Core/Listener.cpp:433 > #22 0x000000080143e4b1 in lldb_private::Listener::WaitForEvent > (this=0x806dbea40, timeout=0x0, event_sp=@0x7ffffedf6e78) > at ../tools/lldb/source/Core/Listener.cpp:481 > #23 0x000000080173ddcc in lldb_private::Process::WaitForEventsPrivate > (this=0x806dbe800, timeout=0x0, event_sp=@0x7ffffedf6e78, > control_only=false) at ../tools/lldb/source/Target/Process.cpp:1423 > #24 0x00000008017488e4 in lldb_private::Process::RunPrivateStateThread > (this=0x806dbe800) at ../tools/lldb/source/Target/Process.cpp:4004 > #25 0x000000080174833d in lldb_private::Process::PrivateStateThread > (arg=0x806dbe800) at ../tools/lldb/source/Target/Process.cpp:3986 > #26 0x00000008013cf29a in ThreadCreateTrampoline (arg=0x806fe5fa0) at > ../tools/lldb/source/Host/common/Host.cpp:576 > #27 0x000000080084722b in thread_start (curthread=0x806c0f000) at > /home/emaste/src/9/lib/libthr/thread/thr_create.c:284 > #28 0x0000000000000000 in ?? () > _______________________________________________ > lldb-dev mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev _______________________________________________ lldb-dev mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
