我有一個錯誤的程序,當執行收到一個SIGSEGV。gdb可以自動附加一個SIGSEGV進程
我可以使用gdb的是這樣的:
$ gdb ./prog
但我寧願從GDB趕上prog
的SIGSEGV,並自動將其固定。
$ ./prog
Segmentation Fault
(gdb) ...
有沒有辦法做到這一點?
感謝
我有一個錯誤的程序,當執行收到一個SIGSEGV。gdb可以自動附加一個SIGSEGV進程
我可以使用gdb的是這樣的:
$ gdb ./prog
但我寧願從GDB趕上prog
的SIGSEGV,並自動將其固定。
$ ./prog
Segmentation Fault
(gdb) ...
有沒有辦法做到這一點?
感謝
嗯。您可以設置一個信號處理程序來啓動當前進程的調試器。這樣你就可以檢查整個「現場」狀態。
#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進行修復。
那麼你總是可以創建一個核心文件,然後使用該內核GDB分析調用堆棧。您可以查看ulimit的手冊頁來完成此操作。
要添加到Mainframe的答案,您可以鏈接您的應用程序與libdebugme(或簡單地LD_PRELOAD
它)實現類似的功能。例如:
DEBUGME_OPTIONS=handle_signals=1 LD_PRELOAD=libdebugme.so ./app
+1很高興知道你可以捕獲這個信號,順便說一句,你需要一個exit()在system()之後,所以它不會被調用多次。 – miedwar 2010-07-13 15:20:08
fn的原型需要一個整數參數才能編譯代碼。 – Fanatic23 2010-07-13 17:32:14