我想获得导致SIGSEGV外部程序的指令地址。我尝试使用ptrace,但是我从内核空间获得EIP(可能是默认的信号处理程序?)。 GDB如何获得正确的EIP?
有没有办法让GDB使用某些API提供这些信息?
编辑: 我没有该程序的源代码,只有二进制可执行文件。我需要自动化,所以我不能简单地在GDB中使用“运行”,“信息寄存器”。我想在我自己的迷你调试器中实现“info registers”:)
答案 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可以处理固定命令。