我的目标是记录给定二进制程序在其运行期间执行的处理器指令数。虽然从源代码(通过gdb或任何其他反汇编程序)获取实际机器代码很容易,但这并没有考虑程序中的函数调用和分支,这些函数调用和分支导致指令被执行多次或完全跳过。
对此有直接的解决方案吗?
答案 0 :(得分:1)
如果您使用的是Linux,则可以通过cachegrind运行程序以获取指令数。
也可以使用ollydbg的运行跟踪功能来获取指令计数,但这可能受到内存的限制。
或者,可以编写一个只需单步运行程序的小型调试器。
答案 1 :(得分:1)
这是非常特定于硬件的,但大多数处理器都提供了一种设施,可以计算流经它们的机器指令(和其他事件)的确切数量。这就是分析器如何捕获缓存未命中之类的东西:通过查询这些内部寄存器。
The PAPI library提供在各种主要处理器上查询此数据的调用。如果您使用的是Linux + x86,PerfSuite会为您提供更高级别的工具,这些工具可能更容易入手。
Intel has a monitor app您可以用来实时观察芯片的内部计数器,他们的Performance Analysis Guide描述了芯片上的各种性能监控单元以及如何读取它们。
答案 2 :(得分:0)
跟踪系统调用的原始工具是特定于平台的。
truss
或dtrace
dtrace
strace
tusc
truss
例如(Solaris):
truss -o ls.truss ls $HOME
这将捕获ls
列出您的主目录时所做的所有系统调用。