2009-11-30 103 views
2

我已经建立了一个版本的gdb 7.0为自己被指出了一个新的功能后,正巧有一个在我的道路依然。GDB 7.0,信号SIGCONT不从暂停()调用打破

试图步一些新的代码,我添加了一个暂停()调用,期待能够摆脱像这样:

 
(gdb) b 5048 
Breakpoint 1 at 0x2b1811b25052: file testca.C, line 5048. 
(gdb) signal SIGCONT 
Continuing with signal SIGCONT. 

Breakpoint 1, FLUSH_SUDF_TEST ([email protected]) at testca.C:5048 
5048  rc = h.SAL_testcaFlushPagesByUDF(uPrimary - 1, uPrimary) ; 

(这是与系统GDB,6.6版) 。

使用gdb 7.0我试过这个时从来没有打过post-pause()断点。通过gdb 7中的各种多进程调试更改,是否有人知道信号处理是否必须以不同方式处理?

+1

我从来没有见过使用“信号SIGCONT”的从断点处继续。通常一个使用“继续”。你尝试了吗? – lothar 2009-12-21 11:56:40

+0

的断点暂停()系统调用后成立,并目的是为了获得这一点(你可以在gd上试试这个)例如b 6.6)。 – 2009-12-21 15:19:01

回答

2

除非调用信号处理函数,否则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) 
+0

啊。优秀。非常感谢你。我能够使用我们已经劫持了一个没有明显副作用的处理程序的SIGPROF。 – 2010-02-13 20:38:52