如何在GDB中获取过程信号信息?

时间:2011-07-31 20:56:26

标签: c gdb signals

有没有办法获取gdb中进程的信号信息(哪些信号被启用,哪些被阻止,哪些是处理程序/选项)?有info signals,但这给了我gdb的信号处理信息,我需要这个信息来调试进程 - 例如查看它是否阻止某些信号或查看它为该信号安装的处理程序。

如果它相关,我的gdb是GNU gdb 6.3.50-20050815 (Apple version gdb-1515) (Sat Jan 15 08:33:48 UTC 2011)

1 个答案:

答案 0 :(得分:10)

假设您已连接到正在运行的进程并且未检查核心转储,并假设gdb可以访问符号,您应该能够调用(通过gdb)POSIX信号处理函数来确定信息,例如哪些信号是被阻止,以及寄存器信号处理程序是什么。

例如,可以使用以下内容来确定是否使用sigaction函数为SIGSEGV == 11信号注册了处理程序:

(gdb) call malloc(sizeof(struct sigaction))
$1 = (void *) 0x...
(gdb) call malloc(sizeof(struct sigaction))
$2 = (void *) 0x...
(gdb) call memset($2, 0, sizeof(struct sigaction))
...
(gdb) call sigaction(11, $2, $1)
$... = 0
(gdb) print *((struct sigaction *)$1)
<prints struct sigaction info>

此信息应该允许您确定处理程序的地址,然后您可以将其传递给'info symbol'命令以确定正在使用哪个函数作为处理程序。

可以执行类似的操作来确定哪些信号被阻止。

此外,特殊的GDB变量$ _siginfo可能对您有用。有关详情,请参阅此处: http://sourceware.org/gdb/onlinedocs/gdb/Signals.html

虽然我的猜测是$ _siginfo不适用于Apple / darwin目标。