GDB: Relaying Trapped OS Signals
By chance, I have managed to land myself in a situation where the bug
occurs only at a signal handler. In my situation, this means that it
happens only when I try to kill the program using a SIGINT
, or more
commonly known as the ‘ctrl-c
’ keystroke.
GDB usually traps this signal, and other signals such as SIGSEGV
(Segmentation Fault), so that you can trace buggy behaviour that is
causing your application to fail. But once in a while, the error may
occur after the signal is sent, when the code failure resides within the
signal handler.
However the default behaviour of GDB is to trap these signals and subsequently consume them, in effect preventing the bug from occurring. To prevent unwanted behaviour in rare cases such as mine, you need to issue the following command:
(gdb) handle SIGINT pass
Given that GDB utilises this signal internally, it will ask you for a
confirmation to change it. Say ‘y
’ to it, and GDB will correspondingly
pass the signal to the application after trapping, which will give you a
chance to debug the handler code that is causing the bug.