2009-11-30 107 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