获取在信号处理程序中导致分段错误的寄存器

Get the register causing a segmentation fault in a signal handler

我知道:

我的问题:我们还能知道哪个寄存器导致了故障吗?鉴于我们没有内存到内存的移动,这应该只是一个寄存器(毕竟,也只有一个 si_addr)。当然,我可以检查所有寄存器并搜索 si_addr,但可能有不止一个匹配项。

我对不依赖于平台的解决方案非常满意。

load/store 地址可能不在任何一个寄存器中;它可能是 [rdi + rax*4 + 100] 之类的寻址模式的结果。

除了运行你的程序在调试器下首先捕获错误,没有简单的解决方案来打印完整调试器会打印的内容,比如一个正常人。或者让它生成一个核心转储供您离线分析,如果您需要调试发生在其他人系统上的崩溃。

Linux 内核选择转储从故障代码地址开始的指令字节(或者实际上在它之前的上下文),以及所有寄存器的内容。可以在事后从崩溃日志中反汇编以查看错误指令,同时查看寄存器内容,而无需在内核本身中包含反汇编程序。请参阅 以了解 Linux 的作用以及手动将其拆开而不是使用 decodecode 的示例。