在被指向一个新功能后,我为自己构建了一个 gdb 7.0 版本,并且碰巧它还在我的道路上。
尝试逐步执行一些新代码,我添加了一个 pause() 调用,希望能够像这样退出:
(gdb) b 5048 Breakpoint 1 at 0x2b1811b25052: file testca.C, line 5048. (gdb) signal SIGCONT Continuing with signal SIGCONT. Breakpoint 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 中的各种多进程调试更改,有人知道是否必须以不同方式处理信号处理以及如何处理?
最佳答案
除非调用信号处理程序,否则 pause()
函数不会返回(请参阅 specification 和 man page)。
要使其在您的程序收到 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)
关于c++ - gdb 7.0,SIGCONT 信号不会中断 pause() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1822199/