0

我正在使用 mprotect 将一些内存页面设置为写保护。当在该内存区域尝试任何写入时,程序会收到一个 SIGSEGV 信号。从信号处理程序中,我知道在哪个内存地址中尝试了写操作,但我不知道如何找出导致写保护违规的指令。因此,在信号处理程序内部,我正在考虑读取程序计数器(PC)寄存器以获取错误指令。有没有简单的方法可以做到这一点?

4

1 回答 1

3

如果使用标志安装信号处理程序sigactionSA_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 回答