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

Posted

技术标签:

【中文标题】如何使用 SIGSEGV 的信号处理程序调试程序【英文标题】:How to debug program with signal handler for SIGSEGV 【发布时间】:2010-08-05 12:59:40 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

GDB 在应用程序之前捕获SIGSEGV

您在评论洛根的回答中所描述的毫无意义。

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

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

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

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

你怎么知道有一个 SIGSEGV 开头? 发布您与GDB 互动的日志也可能很有用。

【讨论】:

你是对的。当然,我应该抓住子进程的错误。谢谢。 我按照您的建议进行了尝试,但另一个问题使应用程序中止:“shell-init:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录”。有什么想法吗?【参考方案2】:

即使程序捕获了 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

【讨论】:

非常感谢您的回复。不,实际上,我使用了“handle all stop”,但没有奏效。即使我尝试了“handle all nopass”,应用仍然捕获到 SIGSEGV,并正常退出。 正确,我又调试了。崩溃似乎发生在一个民间的过程中。

以上是关于如何使用 SIGSEGV 的信号处理程序调试程序的主要内容,如果未能解决你的问题,请参考以下文章

SIGSEGV:程序不按顺序执行

分段错误错误(信号名称:SIGSEGV)的原因是啥,我将如何找到/修复它?

使用 Netbeans/gdb 调试 C 会立即以 SIGSEGV 终止?

如何捕捉并分析SIGSEGV的现场

设备和模拟器上的调试工作时,临时 iPhone SIGSEGV 崩溃

应用程序崩溃(有时),致命信号 11 (SIGSEGV),代码 1