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

Linux 在外部程序中导致SIGSEGV的指令地址,linux,exception,segmentation-fault,ptrace,Linux,Exception,Segmentation Fault,Ptrace,我想得到导致外部程序SIGSEGV的指令地址。为此,我尝试使用ptrace,但我从内核空间获得了EIP(可能是默认的信号处理程序?)。GDB如何获得正确的EIP 有没有办法让GDB使用一些API提供这些信息 编辑: 我没有程序的源代码,只有二进制可执行文件。我需要自动化,所以我不能简单地在GDB中使用“运行”、“信息寄存器”。我想在我自己的迷你调试器中实现“信息寄存器:)用-g编译程序,运行gdb,键入run,然后就会发生错误。然后使用info寄存器并查看rip寄存器 您可以使用objectdu

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

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

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

-g
编译程序,运行
gdb
,键入
run
,然后就会发生错误。然后使用
info寄存器
并查看
rip
寄存器


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

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

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


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

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

您可以使用ptrace附加到进程。我找到了


看起来您需要PTRACE_GETREGS作为寄存器。您将需要查看一些示例代码,如strace,以了解它如何管理信号处理等。在阅读文档时,我发现被跟踪的子级将在每个信号处停止,并且跟踪父级必须
wait()
等待来自子级的信号,然后命令它继续使用PTRACE\u CONT.

我没有源,只有二进制。我需要自动化。对我来说,最好的解决方案是在我的程序中捕获寄存器值。