我想获取导致外部程序到 SIGSEGV 的指令地址。我尝试为此使用 ptrace,但我从内核空间获取 EIP(可能是默认信号处理程序?)。GDB 如何获得正确的 EIP?
有没有办法让 GDB 使用一些 API 提供这些信息?
编辑:我没有程序的来源,只有二进制可执行文件。我需要自动化,所以我不能简单地在 GDB 中使用“运行”、“信息寄存器”。我想在我自己的迷你调试器中实现“信息寄存器”:)
我想获取导致外部程序到 SIGSEGV 的指令地址。我尝试为此使用 ptrace,但我从内核空间获取 EIP(可能是默认信号处理程序?)。GDB 如何获得正确的 EIP?
有没有办法让 GDB 使用一些 API 提供这些信息?
编辑:我没有程序的来源,只有二进制可执行文件。我需要自动化,所以我不能简单地在 GDB 中使用“运行”、“信息寄存器”。我想在我自己的迷你调试器中实现“信息寄存器”:)
您可以使用 ptrace 附加到进程。我在 Linux Gazette 上找到了一篇文章。
看起来您需要 PTRACE_GETREGS 用于寄存器。您将需要查看一些示例代码,例如 strace,以了解它如何管理信号处理等。从阅读文档来看,我认为被跟踪的子进程将在每个信号处停止,并且跟踪父进程必须wait()
接收来自子进程的信号,然后命令它继续使用 PTRACE_CONT。
-g
用, run gdb <your_app>
, type编译你的程序,run
就会出现错误。之后使用info registers
并查看rip
注册表。
您可以使用objectdump -D <your_app>
获取有关该位置代码的更多信息。
ulimit -c unlimited
您可以在运行外部程序之前启用核心转储。
然后,您可以使用崩溃后检查核心转储文件gdb /path/to/program corefile
因为它是二进制的,并且没有使用调试选项编译,所以您必须在寄存器和机器代码级别查看详细信息。
尝试做一个核心转储,然后用 gdb 分析它。如果您的意思是想让 gdb 通过“自动”一键运行所有命令,gdb 也可以这样做。将您的命令输入文件并查看手册的帮助用户定义部分,gdb 可以处理预设命令。