【问题标题】:gdb 7.0, signal SIGCONT doesn't break from a pause() callgdb 7.0,信号 SIGCONT 不会从 pause() 调用中中断
【发布时间】:2009-11-30 20:24:11
【问题描述】:

在被指出一个新功能后,我为自己构建了一个 gdb 7.0 版本,并且碰巧还在我的路径中。

尝试单步执行一些新代码时,我添加了一个 pause() 调用,希望能够像这样退出:

(gdb) b 5048 0x2b1811b25052 处的断点 1:文件 testca.C,第 5048 行。 (gdb) 信号 SIGCONT 继续使用信号 SIGCONT。 断点 1,FLUSH_SUDF_TEST (h=@0x2b1811b061c0) 在 testca.C:5048 5048 rc = h.SAL_testcaFlushPagesByUDF(uPrimary - 1,uPrimary);

(使用系统 gdb,版本 6.6)。

使用 gdb 7.0 时,我在尝试此操作时从未遇到过 post-pause() 断点。随着 gdb 7 中的各种多进程调试更改,有人知道是否必须以不同方式处理信号处理以及如何处理?

【问题讨论】:

  • 我从未见过使用“信号 SIGCONT”从断点继续。通常使用“继续”。你试过了吗?
  • 断点是在 pause() 系统调用之后设置的,目的是那个点(例如,你可以在 gdb 6.6 上试试这个)。

标签: c++ c linux gdb


【解决方案1】:

除非调用信号处理程序,否则pause() 函数不会返回(请参阅specificationman 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) 

【讨论】:

  • 啊。出色的。非常感谢。我可以使用我们劫持的 SIGPROF 来处理没有明显副作用的处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2017-11-13
  • 2021-10-18
相关资源
最近更新 更多