可以捕获写入地址(x86 - linux)

use*_*956 8 c c++ linux x86

我希望能够检测何时发生对内存地址的写入 - 例如通过设置附加到中断的回调.有谁知道怎么样?

我希望能够在运行时执行此操作(可能gdb具有此功能,但我的特定应用程序导致gdb崩溃).

Kho*_*oth 14

如果要拦截对一系列地址的写入,可以使用mprotect()将所讨论的内存标记为不可写,并使用sigaction()捕获生成的SIGSEGV 安装信号处理程序,执行日志记录或其他任何操作并将页面标记为可写入.


Ada*_*vis 8

您需要的是访问X86调试寄存器:http://en.wikipedia.org/wiki/Debug_register

您需要在DR0到DR3之一中设置断点地址,然后在DR7中设置条件(数据写入).将发生中断,您可以运行调试代码来读取DR6并找到导致断点的原因.

如果GDB不起作用,您可以尝试更简单/更小的调试器,例如http://sourceforge.net/projects/minibug/ - 如果这不起作用,您至少可以查看代码并了解如何使用自己在处理器上调试硬件.

此外,还有一个很好的IBM开发人员资源来掌握Linux调试技术,它应该提供一些额外的选项:

http://www.ibm.com/developerworks/linux/library/l-debug/

关于这样做的一篇相当不错的文章就是Windows(我知道你在Linux上运行,但其他人可能会想到在windows中执行此问题):

http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx

-亚当