c++ - gdb 7.0,SIGCONT 信号不会中断 pause() 调用

标签 c++ c linux gdb

在被指向一个新功能后,我为自己构建了一个 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() 函数不会返回(请参阅 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) 

关于c++ - gdb 7.0,SIGCONT 信号不会中断 pause() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1822199/

相关文章:

java - 通过一个Database类访问数据库,紧耦合?破坏建议零售价?

c++ - <random> 的线程安全使用

c++ - 没有 "previous" vector 的 Dijkstra 算法

c++ - OpenMP 循环数组访问中的错误共享

C++/VS2008 : Performance of Macros vs. 内联函数

c++ - 编译器的 `-O0` 选项和 `-Og` 选项有什么区别?

python - python和C之间的通信

c - 我如何保证在释放内存时,操作系统会回收该内存供其使用?

php - 如何在 php 中操作 shell 输出

python - 使用wsgi在apache上部署flask app时如何解决权限错误?