【发布时间】:2010-07-13 11:04:22
【问题描述】:
我有一个错误的程序,在执行时会收到一个 SIGSEGV。
我可以像这样使用 gdb:
$ gdb ./prog
但我希望 gdb 从 prog 捕获 SIGSEGV 并自动附加它。
$ ./prog
Segmentation Fault
(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
【讨论】: