2 min read

Signal handling in LLDB

I don’t normally worry about signal handling in lldb. I don’t often work on codebases that do significant work with them, and so if a signal is raised then it’s a rare enough occurence that the lldb breaking on it seems like a sane default.

However, very occasionally I end up in the situation where I have to debug code that raises a lot of signals that I know I don’t have to care about.

In this case it’s useful to be able to tell lldb what to do (or not do) with them.

By default running process handle will give you a list of all the available signals and some default actions:

(lldb) process handle
NAME         PASS   STOP   NOTIFY
===========  =====  =====  ======
SIGHUP       true   true   true
SIGINT       false  true   true
SIGQUIT      true   true   true
SIGILL       true   true   true
...

In this output PASS means to pass it through to the underlying process, STOP indicates whether lldb should break on that signal and NOTIFY allows us to configure whether we’ll be told about any signals raised.

We can configure these values.

(lldb) process handle -p true -s false -n true SIGINT

This tells lldb to notify us (-n true) when a SIGINT is raised, and then pass it through the process (-p true), but don’t stop the debugger (-s false).

I don’t know what I’m going to do with all the time I’ve saved now I don’t have to continually press c to continue!