2

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

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

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

4

4 回答 4

2

您可以使用 ptrace 附加到进程。我在 Linux Gazette 上找到了一篇文章

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

于 2010-06-16T02:19:27.967 回答
0

-g用, run gdb <your_app>, type编译你的程序,run就会出现错误。之后使用info registers并查看rip注册表。

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

于 2010-06-15T22:05:52.420 回答
0

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

然后,您可以使用崩溃后检查核心转储文件gdb /path/to/program corefile

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

于 2010-06-15T22:20:47.123 回答
0

尝试做一个核心转储,然后用 gdb 分析它。如果您的意思是想让 gdb 通过“自动”一键运行所有命令,gdb 也可以这样做。将您的命令输入文件并查看手册的帮助用户定义部分,gdb 可以处理预设命令。

于 2010-06-15T22:33:37.283 回答