【问题标题】:Get a log of all the memory locations modified by a C program获取 C 程序修改的所有内存位置的日志
【发布时间】:2012-09-05 00:40:37
【问题描述】:

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

有人有什么建议或意见吗?

谢谢!

【问题讨论】:

  • 您是否尝试过在每次分配虚拟内存时添加断点然后查看这些地址?
  • 您是否尝试过将导线焊接到您的 ram 芯片并将它们连接到逻辑分析仪?
  • @DanZimm 不。我没有这样做的原因之一是我相信使用断点会很慢,尤其是在我们有大量内存更新的情况下。其次,不知道通过push之类的指令更新内存是否可以这样捕获。

标签: c debugging memory gdb instrumentation


【解决方案1】:

您可以使用英特尔创建的工具Pin 监控内存存储、读取、寄存器内容等。这是project from MIT that simulates a processor cache(指令和/或数据)。 Pin 用于创建详细的指令跟踪,然后将跟踪用作缓存模拟器的输入。

【讨论】:

  • 谢谢!与 Pin 库捆绑在一起的示例(/source/tools/ManualExamples 中的 pinatrace)很好地满足了我的需求。我可以轻松编辑它以满足我的需要。此外,使用 Pintools 进行检测似乎不会太慢,这总是一个优点。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢关于使用 ptrace 编写我自己的调试器的建议。最终,我认为这就是我想做的事情。
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2012-06-23
相关资源
最近更新 更多