MPROTECT:如何获取导致保护冲突的指令
mprotect: how to get the instruction which causes protection violation?
我正在使用mprotect将一些内存页设置为写保护。当在该内存区域中尝试任何写入时,程序会获得 SIGSEGV 信号。从信号处理程序中,我知道尝试写入的内存地址,但我不知道如何找出导致写入保护违规的指令。因此,在信号处理程序中,我正在考虑读取程序计数器(PC)寄存器以获取错误的指令。有没有简单的方法可以做到这一点?
如果使用带有 SA_SIGINFO
标志的 sigaction
安装信号处理程序,则信号处理程序的第三个参数的类型为 void *
,但指向类型 ucontext_t
的结构,而该结构又包含类型 mcontext_t
的结构。mcontext_t
的内容是实现定义的,通常特定于 CPU 体系结构,但您可以在此处找到保存的程序计数器。
编译器的内置函数(我认为__builtin_return_address
具有非零参数)以及展开表也有可能能够跟踪信号处理程序。虽然这在某些方面更通用(它不是明显的特定于 cpu-arch),但我认为它也更脆弱,它是否实际工作可能是特定于 cpu-arch 和 ABI 的。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么在保护模式下继承升级不起作用
- 访问被拒绝后,c++中的故障保护代码
- C++:无法访问声明的受保护成员
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么您需要C++头文件的包含保护
- lock_guard是否保护返回值
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 继承和友元函数,从基类访问受保护的成员
- 为什么在2.CPP文件中包含此头文件(带头保护)会导致命名冲突
- 受保护成员与重载运算符冲突
- MPROTECT:如何获取导致保护冲突的指令
- 系统访问冲突异常:试图读取或写入受保护的内存