加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 获取有关分段错误或崩溃的指令指针(对于x86 JIT编译器

发布时间:2020-12-13 22:51:06 所属栏目:Linux 来源:网络整理
导读:我正在为生成x86代码的 JavaScript JIT编译器实现后端.有时,由于错误,我会遇到分段错误.追溯导致它们的原因可能非常困难.因此,我一直想知道是否会有一些“简单”的方法来捕获分段错误和其他此类崩溃,并获取导致错误的指令的地址.这样,我可以将地址映射回已编
我正在为生成x86代码的 JavaScript JIT编译器实现后端.有时,由于错误,我会遇到分段错误.追溯导致它们的原因可能非常困难.因此,我一直想知道是否会有一些“简单”的方法来捕获分段错误和其他此类崩溃,并获取导致错误的指令的地址.这样,我可以将地址映射回已编译的x86程序集,甚至可以返回源代码.

这需要在Linux上运行,但理想情况下适用于任何符合POSIX标准的系统.在最坏的情况下,如果我无法捕获seg故障并在运行JIT中获取IP,我希望能够将其捕获到外部(内核日志?),并且可能只是让编译器转储一个大文件将地址映射到指令,我可以将其与Python脚本或其他东西匹配.

任何想法/建议表示赞赏.如果您曾经使用过自己的编译器项目,请随意分享您自己的调试技巧.

解决方法

如果使用sigaction,则可以定义一个带有3个参数的信号处理程序:

void (*sa_sigaction)(int signum,siginfo_t *info,void *ucontext)

传递给信号处理程序的第三个参数是指向OS和体系结构特定数据结构的指针.在linux上,它是一个ucontext_t,它在< sys / ucontext.h>中定义.头文件.其中,uc_mcontext是一个mcontext_t(机器上下文),对于x86,它包含gregs中信号时的所有寄存器.所以你可以访问

ucontext->uc_mcontext.gregs[REG_EIP]  (32 bit mode)
ucontext->uc_mcontext.gregs[REG_RIP]  (64 bit mode)

获取错误指令的指令指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读