我为自己构build了一个gdb 7.0版本,并指向了一个新的特性,并且碰巧在我的path中仍然有这个版本。
试图通过一些新的代码,我添加了一个暂停()调用,期望能够像这样出去:
(gdb)b 5048在0x2b1811b25052处的断点1:file testca.C,line 5048.(gdb)signal SIGCONT继续使用SIGCONT信号。 断点1,FLUSH_SUDF_TEST(h = @ 0x2b1811b061c0)at testca.C:5048 5048 rc = h.SAL_testcaFlushPagesByUDF(uPrimary - 1,uPrimary);
(这是与系统gdb版本6.6)。
使用gdb 7.0时,我尝试这个时从来没有打过post-pause()断点。 通过gdb 7中的各种多进程debugging更改,是否有人知道信号处理是否需要进行不同的处理?
除非调用信号处理函数,否则pause()
函数不会返回(请参阅规范和手册页 )。
为了在程序收到SIGCONT之后返回,你必须为SIGCONT安装一个处理程序。 尝试看看使用下面的例子:
#include <signal.h> #include <stdio.h> #include <string.h> #include <unistd.h> volatile int caught_signal = 0; void handler(int sig) { caught_signal = sig; } int main() { signal(SIGCONT, handler); pause(); printf("Caught signal: %d, %s\n", caught_signal, strsignal(caught_signal)); return 0; }
gdb 7.0的行为是正确的: pause()
完全忽略忽略的信号(如SIGCHLD
,在捕获的信号( SIGCONT
)上返回,并且在发出continue
命令时没有信号传递。
(gdb) break 17 Breakpoint 1 at 0x80484b3: file pause.c, line 17. (gdb) continue Continuing. ^C Program received signal SIGINT, Interrupt. 0x0012d422 in __kernel_vsyscall () (gdb) signal SIGCHLD Continuing with signal SIGCHLD. ^C Program received signal SIGINT, Interrupt. 0x0012d422 in __kernel_vsyscall () (gdb) signal SIGCONT Continuing with signal SIGCONT. Breakpoint 1, main () at pause.c:17 17 printf("Caught signal: %d, %s\n", (gdb)