有没有办法让gdb中的进程获得信号信息(哪些信号被启用,哪些被阻塞,什么是处理程序/选项)?有info signals
,但这给了我gdb的信号处理信息,我需要这个信息进行调试 - 例如,查看它是否阻止了某个信号,或查看它为该信号安装哪个处理程序。如何在GDB中获取过程信号信息?
如果是相关的,我的gdb是GNU gdb 6.3.50-20050815 (Apple version gdb-1515) (Sat Jan 15 08:33:48 UTC 2011)
。
有没有办法让gdb中的进程获得信号信息(哪些信号被启用,哪些被阻塞,什么是处理程序/选项)?有info signals
,但这给了我gdb的信号处理信息,我需要这个信息进行调试 - 例如,查看它是否阻止了某个信号,或查看它为该信号安装哪个处理程序。如何在GDB中获取过程信号信息?
如果是相关的,我的gdb是GNU gdb 6.3.50-20050815 (Apple version gdb-1515) (Sat Jan 15 08:33:48 UTC 2011)
。
假设你连接到正在运行的进程并且没有检查核心转储,并且假设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 /达尔文目标。
$ _siginfo确实不可用,但手动方法的作用像一个魅力(有一个更正 - gdb需要手动指定返回类型)。谢谢! – StasM
你不需要'malloc','memset'或以其他方式将第二个参数传递给'sigaction',只需传递0(NULL),如果'gdb'有困惑,也可能需要使用'__sigaction' *函数*'sigaction'与* struct *。例如。调用malloc(sizeof(struct sigaction))'一次,然后'立即调用__sigaction(11,0,$ 1)'。 – vladr