我正在使用mprotect将一些内存页设置为写保护。当在该存储器区域中尝试任何写入时,程序得到SIGSEGV信号。从信号处理程序中,我知道写入是在哪个内存地址尝试的,但我不知道如何找出哪条指令导致写保护冲突。因此,在信号处理程序中,我正在考虑读取程序计数器(PC)寄存器以获取错误指令。有什么简单的方法可以做到这一点吗?
发布于 2013-10-31 13:17:18
如果使用带有SA_SIGINFO标志的sigaction安装信号处理程序,则信号处理程序的第三个参数的类型为void *,但指向ucontext_t类型的结构,而该结构又包含mcontext_t类型的结构。mcontext_t的内容是由实现定义的,通常是特定于cpu架构的,但是您可以在这里找到保存的程序计数器。
编译器的内置(我认为是带有非零参数的__builtin_return_address)和展开表也可能能够跟踪整个信号处理程序。虽然这在某些方面更通用(它显然不是cpu-arch特定的),但我认为它也更脆弱,它是否真正有效可能是cpu-arch和ABI特定的。
https://stackoverflow.com/questions/19697768
复制相似问题