2010-07-13 57 views
8

我有一個錯誤的程序,當執行收到一個SIGSEGV。gdb可以自動附加一個SIGSEGV進程

我可以使用gdb的是這樣的:

$ gdb ./prog 

但我寧願從GDB趕上prog的SIGSEGV,並自動將其固定。

$ ./prog 
Segmentation Fault 
(gdb) ... 

有沒有辦法做到這一點?

感謝

回答

12

嗯。您可以設置一個信號處理程序來啓動當前進程的調試器。這樣你就可以檢查整個「現場」狀態。

#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

const char *prog=0; 
void fn(int signum) 
{ 

    char buf[256]; 
    snprintf(buf,255,"ddd %s %d",prog,getpid()); 
    system(buf); 
} 
int main(int argc, char **argv) 
{ 
    prog=argv[0]; 
    signal(SIGSEGV,&fn); 
    int *p=0; 
    int k=*p; 
} 

更新:根據miedwar和Fanatic23的建議進行更新。當前的Ubuntu發行版配置爲禁止調試非子進程。請參閱https://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process進行修復。

+1

+1很高興知道你可以捕獲這個信號,順便說一句,你需要一個exit()在system()之後,所以它不會被調用多次。 – miedwar 2010-07-13 15:20:08

+1

fn的原型需要一個整數參數才能編譯代碼。 – Fanatic23 2010-07-13 17:32:14

3

那麼你總是可以創建一個核心文件,然後使用該內核GDB分析調用堆棧。您可以查看ulimit的手冊頁來完成此操作。

Check this link for more info

1

要添加到Mainframe的答案,您可以鏈接您的應用程序與libdebugme(或簡單地LD_PRELOAD它)實現類似的功能。例如:

DEBUGME_OPTIONS=handle_signals=1 LD_PRELOAD=libdebugme.so ./app 
相關問題