3

我需要一个 C 程序在执行期间修改的所有内存位置的日志。这个问题比使用gdb/valgrind观察内存区域要复杂一些,因为我没有内存区域的开始结束地址。基本上,无论何时何地程序进行内存更新(以push移动到内存操作数等的形式),我都需要该内存地址以及写入该地址的值。

有没有人有任何建议或意见?

谢谢!

4

2 回答 2

6

您可以使用英特尔创建的工具Pin来监控内存存储、读取、寄存器内容等。这是麻省理工学院的一个模拟处理器缓存(指令和/或数据)的项目。Pin 用于创建详细的指令跟踪,然后将跟踪用作缓存模拟器的输入。

于 2012-09-05T00:47:44.377 回答
1

如果您可以在模拟器下运行程序,则可以使用模拟器记录您想要的数据。您可以在 Wikipedia 上找到几个X86 仿真器,包括 Bochs 和 QEMU。

我可以想到一个使用mprotect()SIGSEGV处理程序的解决方案:受保护的内存将在您访问它时产生信号。如果处理程序记录地址并重新启用访问,则错误指令将恢复(并成功)。不过,我看不到您如何再次保护该段。

您可以编写自己的调试器(查看ptrace()手册页,它并不复杂),它只存在于PT_STEP您的程序中。您可能必须解析暂停的指令以确定它是否是内存访问,然后自己计算有效地址(使用 获取任何必要的寄存器PT_ GETREGS)。

于 2012-09-05T01:35:27.510 回答