linux - 在信号处理程序中获取导致分段错误的寄存器
问题描述
我知道:
当使用和 a (而不是)安装
SIGSEGV
信号处理程序时,信号处理程序会接收 a ,其中的是发生故障的地址。sigaction
sa_sigaction
sa_handler
siginfo_t*
si_addr
使用
ucontext_t
我们可以检查寄存器的值,例如指令指针,尽管不是以独立于平台的方式(Linux 信号处理。如何获取中断指令的地址?)。
我的问题:我们还能知道哪个寄存器导致了错误吗?鉴于我们没有内存到内存的移动,这应该只有一个寄存器(毕竟也只有一个si_addr
)。当然,我可以检查所有寄存器并搜索si_addr
,但可能不止一个匹配项。
我会对不独立于平台的解决方案感到非常满意。
解决方案
加载/存储地址可能不在任何单个寄存器中;它可能是寻址模式之类的结果[rdi + rax*4 + 100]
。
除了像普通人一样在调试器下运行程序以首先捕获故障之外,没有简单的解决方案可以打印完整的调试器。或者让它生成一个核心转储供您离线分析,如果您需要调试其他人系统上发生的崩溃。
Linux 内核选择转储从故障代码地址开始的指令字节(或者实际上在它之前的某个位置作为上下文),以及所有寄存器的内容。可以在事后从崩溃日志中进行反汇编以查看错误指令,同时查看寄存器内容,而无需在内核本身中包含反汇编程序。请参阅Linux 内核崩溃消息中的“代码”是什么?有关 Linux 所做的示例,以及手动将其分开而不是使用decodecode
.
推荐阅读
- c - 如何在C中实现单链表
- colors - 使用 init_color() 定义颜色值时遇到问题;在 c 中的 ncurses
- javascript - Eslint 或 prettier 在 vscode 的行尾添加 2 个分号
- c++ - 如何从现有的基类对象创建派生类对象?
- c++ - 使用相同的流对象写入文件流或字符串流
- java - 文件循环 -> 流循环 -> 添加到现有集合
- android - Android Q - 如何获取外部 SD 卡公共下载目录路径
- android - Android Retrofit - 工作 URL 上的 404 错误
- python - 光束偏转和 p
- c++ - 具有多列(数量可变)的 C++ Ifstream 错误