我正在为生成 x86 代码的 JavaScript JIT 编译器实现后端。有时,由于错误,我会遇到段错误。很难追溯是什么原因造成的。因此,我一直想知道是否有一些“简单”的方法来捕获段错误和其他此类崩溃,并获取导致错误的指令的地址。这样,我就可以将地址映射回已编译的 x86 程序集,甚至可以映射回源代码。
这需要在 Linux 上运行,但最好在任何 POSIX 兼容系统上运行。在最坏的情况下,如果我无法捕获段错误并在运行的 JIT 中获取 IP,我希望能够将其捕获到外部(内核日志?),也许只是让编译器转储一个大文件将地址映射到指令,我可以将其与 Python 脚本或其他东西相匹配。
任何想法/建议都将受到赞赏。如果您曾经从事过自己的编译器项目,请随时分享您自己的调试技巧。
最佳答案
如果您使用 sigaction
,您可以定义一个带有 3 个参数的信号处理程序:
void (*sa_sigaction)(int signum, siginfo_t *info, void *ucontext)
传递给信号处理程序的第三个参数是指向操作系统和体系结构特定数据结构的指针。在 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)
获取错误指令的指令指针。
关于linux - 获取关于段错误或崩溃的指令指针(针对 x86 JIT 编译器项目)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102535/