2010-08-05 75 views
6

我正在爲應用程序編寫插件,有時會丟棄SIGSEGV。但是,應用程序捕獲信號SIGSEGV。換句話說,插件是一個動態庫。該錯誤發生在我的插件和動態庫中。但應用程序處理sSIGSEGV並正常退出。所以,我很難調試並獲得所有堆棧幀的回溯。任何想法?如何使用SIGSEGV的信號處理程序調試程序

目前我正在使用gdb作爲調試工具。

回答

6

GDB SIGSEGV之前的應用程序一樣。

你在評論Logan的答案中描述的是沒有道理的。

我懷疑真正發生的事情是應用程序創建一個新進程,並且只在其他進程中獲得SIGSEGV,而不是您附加到GDB的進程。如果我的猜測是正確的

下面的命令可能是有用的:

(gdb) catch fork 
(gdb) catch vfork 
(gdb) set follow-fork-mode child 

您可能還需要編輯和擴大你的問題:

  • 你怎麼知道有一個SIGSEGV開始?
  • 將您與GDB的互動日誌發佈也可能有用。
+0

你是對的。當然,我應該抓住孩子進程的錯誤。謝謝。 – Blad 2010-08-09 02:06:03

+0

我試着根據你的建議,但另一個問題使應用程序中止:「shell-init:錯誤檢索當前目錄:getcwd:無法訪問父目錄:沒有這樣的文件或目錄」。任何想法? – Blad 2010-08-09 06:54:57

4

即使程序陷阱SIGSEGV,gdb仍然應該首先獲得它並給你一個調試程序的機會。你做過類似

handle SIGSEGV nostop 

in GDB?如果是這樣,那可能是爲什麼它不停止。

您確定段落髮生了嗎?您是否可以用另一個程序複製此行爲,或通過故意導致分段違規?

例如:

$ cat sig.c 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

void handle(int n) 
{ 
     puts("Bail"); 
     exit(1); 
} 

int main() 
{ 
     signal(SIGSEGV, handle); 
     int *pi = 0; 
     *pi = 10; 
     return 0; 
} 
$ gcc -g sig.c 
$ ./a.out 
Bail 
$ gdb ./a.out 
GNU gdb 6.6-debian 
Copyright (C) 2006 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i486-linux-gnu"... 
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". 
(gdb) run 
Starting program: /home/elcapaldo/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x08048421 in main() at sig.c:15 
15    *pi = 10; 
(gdb) where 
#0 0x08048421 in main() at sig.c:15 
(gdb) c 
Continuing. 
Bail 

Program exited with code 01. 
(gdb) q 
+0

非常感謝您的回覆。不,實際上,我使用「處理所有停止」,但它沒有奏效。即使我嘗試過「處理所有nopass」,該應用仍然抓住了SIGSEGV,並正常退出。 – Blad 2010-08-06 02:03:37

+0

正確,我再次調試。看起來崩潰發生在一個相反的過程中。 – Blad 2010-08-09 02:57:59