gpt4 book ai didi

c++ - mprotect:如何获取导致保护违规的指令?

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:57 25 4
gpt4 key购买 nike

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

最佳答案

如果您使用带有 SA_SIGINFO 标志的 sigaction 安装信号处理程序,则信号处理程序的第三个参数的类型为 void * 但指向到 ucontext_t 类型的结构,该结构又包含 mcontext_t 类型的结构。 mcontext_t 的内容是实现定义的,通常是特定于 cpu 架构的,但这是您可以找到保存的程序计数器的地方。

编译器的内置函数(我认为带有非零参数的__builtin_return_address)和展开表也有可能能够跟踪整个信号处理程序。虽然这在某些方面更通用(它不是明显的 cpu-arch-specific),但我认为它也更脆弱,它是否真的有效可能是 cpu-arch- 和 ABI-specific。

关于c++ - mprotect:如何获取导致保护违规的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19697768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com