我需要一个 C 程序在执行期间修改的所有内存位置的日志。这个问题比使用gdb/valgrind观察内存区域要复杂一些,因为我没有内存区域的开始或结束地址。基本上,无论何时何地程序进行内存更新(以push、移动到内存操作数等的形式),我都需要该内存地址以及写入该地址的值。
有没有人有任何建议或意见?
谢谢!
我需要一个 C 程序在执行期间修改的所有内存位置的日志。这个问题比使用gdb/valgrind观察内存区域要复杂一些,因为我没有内存区域的开始或结束地址。基本上,无论何时何地程序进行内存更新(以push、移动到内存操作数等的形式),我都需要该内存地址以及写入该地址的值。
有没有人有任何建议或意见?
谢谢!
您可以使用英特尔创建的工具Pin来监控内存存储、读取、寄存器内容等。这是麻省理工学院的一个模拟处理器缓存(指令和/或数据)的项目。Pin 用于创建详细的指令跟踪,然后将跟踪用作缓存模拟器的输入。
如果您可以在模拟器下运行程序,则可以使用模拟器记录您想要的数据。您可以在 Wikipedia 上找到几个X86 仿真器,包括 Bochs 和 QEMU。
我可以想到一个使用mprotect()
和SIGSEGV
处理程序的解决方案:受保护的内存将在您访问它时产生信号。如果处理程序记录地址并重新启用访问,则错误指令将恢复(并成功)。不过,我看不到您如何再次保护该段。
您可以编写自己的调试器(查看ptrace()
手册页,它并不复杂),它只存在于PT_STEP
您的程序中。您可能必须解析暂停的指令以确定它是否是内存访问,然后自己计算有效地址(使用 获取任何必要的寄存器PT_
GETREGS
)。