【问题标题】:Can gdb automatically attach a process on a SIGSEGVgdb 可以自动在 SIGSEGV 上附加进程吗
【发布时间】:2010-07-13 11:04:22
【问题描述】:

我有一个错误的程序,在执行时会收到一个 SIGSEGV。

我可以像这样使用 gdb:

$ gdb ./prog 

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

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

有没有办法做到这一点?

谢谢

【问题讨论】:

    标签: c linux gcc gdb


    【解决方案1】:

    嗯。您可以设置一个信号处理程序以使用当前进程启动调试器。这样您就可以“实时”检查整个状态。

    #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 很高兴知道你可以捕捉到这个信号,顺便说一句,你需要在 system() 之后有一个 exit(),这样它就不会被多次调用。
    • fn 的原型需要一个整数参数来编译代码。
    【解决方案2】:

    你总是可以创建一个核心文件,然后在该核心上使用 gdb 分析调用堆栈。您可以查看 ulimit 的手册页来执行此操作。

    Check this link for more info.

    【讨论】:

      【解决方案3】:

      要添加到 Mainframe 的答案,您可以将您的应用程序与 libdebugme(或简单地 LD_PRELOAD 它)链接以实现类似的功能。例如:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 2011-07-17
        • 2017-12-23
        • 2014-06-15
        相关资源
        最近更新 更多