在外部程序中导致SIGSEGV的指令地址

时间:2010-06-15 21:52:20

标签: linux exception sigsegv ptrace

我想获得导致SIGSEGV外部程序的指令地址。我尝试使用ptrace,但是我从内核空间获得EIP(可能是默认的信号处理程序?)。 GDB如何获得正确的EIP?

有没有办法让GDB使用某些API提供这些信息?

编辑: 我没有该程序的源代码,只有二进制可执行文件。我需要自动化,所以我不能简单地在GDB中使用“运行”,“信息寄存器”。我想在我自己的迷你调试器中实现“info registers”:)

4 个答案:

答案 0 :(得分:2)

您可以使用ptrace附加到进程。我找到了an article at Linux Gazette

看起来您需要PTRACE_GETREGS作为寄存器。您将需要查看一些示例代码,如strace,以了解它如何管理信号处理等。通过阅读文档,我看到跟踪的孩子将在每个信号停止,并且跟踪父母必须wait()来获取来自孩子的信号,然后命令它继续使用PTRACE_CONT。

答案 1 :(得分:0)

使用-g编译您的程序,运行gdb <your_app>,输入run,然后就会出错。之后使用info registers并查看rip注册表。

您可以使用objectdump -D <your_app>获取有关该位置代码的更多信息。

答案 2 :(得分:0)

在运行外部程序之前,您可以使用ulimit -c unlimited启用核心转储。

然后,您可以使用gdb /path/to/program corefile

检查崩溃后的核心转储文件

因为它是二进制的而不是用调试选项编译的,所以你必须在寄存器和机器代码级别查看详细信息。

答案 3 :(得分:0)

尝试制作核心转储,然后使用gdb进行分析。如果你的意思是想让gdb通过'automate'轻轻一键完成所有命令,那么gdb也可以这样做。在一个文件中键入你的命令并查看帮助用户定义的手册部分,gdb可以处理固定命令。