[lldb-dev] Linux/Posix spawning, signal masking

Todd Fiala tfiala at google.com
Tue Jan 21 22:49:54 PST 2014

Hi all,

In source/Host/common/Host.cpp, there is a posix process spawning method
called LaunchProcessPosixSpawn.  On my Linux system, it is used to start
the target process in lldb-gdbserver.  It looks like FreeBSD uses it as
well.  Most of the Platform launchers appear to funnel to it as well (via
Host::LaunchProcess ()).

There is a section of code in LaunchProcessPosixSpawn that masks all
signals for the child process that is started up:

::posix_spawnattr_setsigmask(&attr, &all_signals)

When that is set, it seems to be preventing the child from receiving
everything except the non-blockable signals.  This has the effect of (at
the very least) blocking SIGINT (i.e. ^C from the keyboard) and SIGTERM
(standard unadorned "kill pid").  This appears to be the cause of a few
bugs as I try to get lldb-gdbserver working on Linux.  For example:

1. hitting ^C on an lldb-gdbserver that spawned a debuggee target process
would kill the lldb-gdbserver, but not the debuggee target, which continues
to run.

2. sending a SIGTERM (kill {debuggee pid}) while it is getting debugged and
running is ignored.

3. sending a SIGTERM to the debuggee after issue #1 (where lldb-gdbserver
is no longer running) is ignored.

4. killing lldb-gdbserver from an attached lldb that shuts down and kills
the remote does indeed kill lldb-gebserver, but does not kill the target

(Of course sending a 'kill -9 {debuggee pid}' works fine to kill the target

I've modified this method locally to not mask any signals:

::posix_spawnattr_setsigmask (&attr, &no_signals)

This seems to address all the problems I had above for lldb-gdbserver as
signals propagate properly, and the target responds correctly to signals
sent when the parent dies, etc.

I've also run all the existing tests (on my system, that amounts to 275
tests that really run), and those are all passing.

However, given that so much code flows through here (or at least appears
to) that is not directly related to the lldb-gdbserver --- i.e. local
linux/FreeBSD debugging --- I'm highly skeptical that this is the right
fix.  I did try using local debugging with lldb with my change in place,
and that seemed to work fine.  But I'm thinking that perhaps the signal
blocking was intended and that behavior is needed in some cases that
(perhaps) are not covered by tests that run on Linux.

Any thoughts on why all the signals were getting masked on process
spawning?  Does that change look okay as is?


Todd Fiala
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140121/736fd8c4/attachment.html>

More information about the lldb-dev mailing list