我正在使用 mprotect 将一些内存页面设置为写保护。当在该内存区域尝试任何写入时,程序会收到一个 SIGSEGV 信号。从信号处理程序中,我知道在哪个内存地址中尝试了写操作,但我不知道如何找出导致写保护违规的指令。因此,在信号处理程序内部,我正在考虑读取程序计数器(PC)寄存器以获取错误指令。有没有简单的方法可以做到这一点?
问问题
269 次
1 回答
3
如果使用标志安装信号处理程序sigaction
,SA_SIGINFO
则信号处理程序的第三个参数具有 typevoid *
但指向 type 的结构ucontext_t
,该结构又包含 type 的结构mcontext_t
。的内容mcontext_t
是实现定义的,并且通常是特定于 cpu 架构的,但在这里您可以找到保存的程序计数器。
编译器的内置__builtin_return_address
函数(我认为带有非零参数)以及展开表也可能能够跟踪信号处理程序。虽然这在某些方面更通用(它不是明显特定于 cpu-arch),但我认为它也更脆弱,并且它是否真的有效可能是 cpu-arch- 和 ABI 特定的。
于 2013-10-31T05:17:18.133 回答