如何通过二进制程序监视机器代码调用

时间:2011-02-08 17:45:09

标签: c machine-code

我的目标是记录给定二进制程序在其运行期间执行的处理器指令数。虽然从源代码(通过gdb或任何其他反汇编程序)获取实际机器代码很容易,但这并没有考虑程序中的函数调用和分支,这些函数调用和分支导致指令被执行多次或完全跳过。

对此有直接的解决方案吗?

3 个答案:

答案 0 :(得分:1)

如果您使用的是Linux,则可以通过cachegrind运行程序以获取指令数。

也可以使用ollydbg的运行跟踪功能来获取指令计数,但这可能受到内存的限制。

或者,可以编写一个只需单步运行程序的小型调试器。

答案 1 :(得分:1)

这是非常特定于硬件的,但大多数处理器都提供了一种设施,可以计算流经它们的机器指令(和其他事件)的确切数量。这就是分析器如何捕获缓存未命中之类的东西:通过查询这些内部寄存器。

The PAPI library提供在各种主要处理器上查询此数据的调用。如果您使用的是Linux + x86,PerfSuite会为您提供更高级别的工具,这些工具可能更容易入手。

Intel has a monitor app您可以用来实时观察芯片的内部计数器,他们的Performance Analysis Guide描述了芯片上的各种性能监控单元以及如何读取它们。

答案 2 :(得分:0)

跟踪系统调用的原始工具是特定于平台的。

  • Solaris:trussdtrace
  • MacOS X:dtrace
  • Linux:strace
  • HP-UX:tusc
  • AIX:truss
  • Windows:...

例如(Solaris):

truss -o ls.truss ls $HOME

这将捕获ls列出您的主目录时所做的所有系统调用。

OTOH,这可能不是你所追求的......在这种情况下,它的价值有限。