如何使用SIGSEGV的信号处理程序调试程序

时间:2010-08-05 12:59:41

标签: c++ linux debugging gdb

我正在为一个应用程序编写一个插件,偶尔会抛出一个SIGSEGV。但是,应用程序捕获信号SIGSEGV。换句话说,插件是一个动态库。错误发生在我的插件和动态库中。但applcation处理sSIGSEGV并正常退出。因此,我很难调试并获得所有堆栈帧的回溯。任何的想法?

目前我正在使用gdb作为调试工具。

2 个答案:

答案 0 :(得分:8)

GDB 将在应用程序执行之前捕获SIGSEGV

你对Logan的回答所描述的内容毫无意义。

我怀疑真正发生的事情是应用程序创建了一个新进程,并且只在另一个进程中获得SIGSEGV,而不是您附加GDB的进程。

如果猜测正确,以下命令可能会有用:

(gdb) catch fork
(gdb) catch vfork
(gdb) set follow-fork-mode child

您可能还想编辑和扩展您的问题:

  • 你怎么知道 一个SIGSEGV开头?
  • 发布与GDB的互动记录也可能有用。

答案 1 :(得分:4)

即使程序陷入SIGSEGV,gdb仍应首先获取它,并为您提供调试程序的机会。你做过像

这样的事吗?
 handle SIGSEGV nostop
GDB中的

?如果是这样,那可能就是为什么它没有停止。

您确定实际发生了段错误吗?您可以使用其他程序复制此行为,还是故意导致分段违规?

例如:

$ cat sig.c
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void handle(int n)
{
        puts("Bail");
        exit(1);
}

int main()
{
        signal(SIGSEGV, handle);
        int *pi = 0;
        *pi = 10;
        return 0;
}
$ gcc -g sig.c
$ ./a.out
Bail
$ gdb ./a.out
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) run
Starting program: /home/elcapaldo/a.out

Program received signal SIGSEGV, Segmentation fault.
0x08048421 in main () at sig.c:15
15              *pi = 10;
(gdb) where
#0  0x08048421 in main () at sig.c:15
(gdb) c
Continuing.
Bail

Program exited with code 01.
(gdb) q