我有一台Linux机器,我试图捕捉所有写入或读取到内存的特定时间(基本上需要字节地址和正在写入的值)。是否有任何工具可以帮助我这样做,或我必须改变操作系统的代码?
发布于 2013-10-19 02:40:03
您提到只希望监视内存读写到某个物理内存地址。我将假设,当您说内存读写时,您指的是将数据读/写到内存的程序集指令,而不是获取指令。
您必须修改内核中的一些分页代码,以便在访问某个地址范围时出现页面错误。然后,在页面错误处理程序中,您可以以某种方式记录访问。您可以通过解码导致错误的指令并从寄存器中读取数据来提取目标地址和数据。日志记录之后,该页被配置为无故障,并重新尝试该指令。类似于复制到写入技术,但您正在记录每个区域的读/写。
另一种,硬件,方法是以某种方式安装总线嗅探器,或者点击平台上的硬件调试接口,以监视正在访问的内存区域,但我认为这种方法会遇到缓存问题。
正如另一张海报所提到的,您还可以修改一个模拟器来捕获某些内存访问并在此上运行您的代码。
我想说,这两种方法都是非常特定于平台的,并且需要付出很大的努力。出于好奇,你希望实现什么?必须有更好的方法来解决这个问题,而不是监视对物理内存的访问。
发布于 2013-10-18 21:49:52
自我反省适合于某些类型的调试.对于一个完整的内存访问跟踪,它不是。调试代码如何在不执行更多内存访问的情况下存储跟踪?
如果您想留在软件中,您最好的选择是在模拟器中运行正在跟踪的代码。不是使用MMU在提供直接访问的同时隔离测试代码的虚拟机,而是一个完整的模拟器。x86和您所关心的大多数其他体系结构都有很多。
发布于 2013-10-18 23:26:52
如果您只对特定进程的内存读写感兴趣(用于部分/所有该进程的虚拟内存空间),则可以使用ptrace和mprotect的组合(mprotect使内存不可访问,直到它访问内存,然后单步运行)。
https://stackoverflow.com/questions/19457342
复制相似问题