gdb可以自动在SIGSEGV上附加进程

时间:2010-07-13 11:04:23

标签: c linux gcc gdb

我有一个错误的程序,当执行接收SIGSEGV时。

我可以像这样使用gdb:

$ gdb ./prog 

但是我希望gdb从prog捕获SIGSEGV并自动附加它。

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

有办法吗?

由于

3 个答案:

答案 0 :(得分: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 :(得分:3)

您可以随时创建核心文件,然后使用该核心上的gdb分析callstack。您可以查看ulimit的手册页。

Check this link for more info

答案 2 :(得分:1)

要添加到大型机的答案,您可以将应用与libdebugme(或简称LD_PRELOAD)相关联,以实现类似的功能。例如:

DEBUGME_OPTIONS=handle_signals=1 LD_PRELOAD=libdebugme.so ./app