我的目标是记录给定二进制程序在运行期间执行的处理器指令的数量。虽然很容易从源代码中获取实际的机器代码(通过 gdb 或任何其他反汇编程序),但这并未考虑程序中导致指令执行多次或完全跳过的函数调用和分支。
有一个简单的解决方案吗?
我的目标是记录给定二进制程序在运行期间执行的处理器指令的数量。虽然很容易从源代码中获取实际的机器代码(通过 gdb 或任何其他反汇编程序),但这并未考虑程序中导致指令执行多次或完全跳过的函数调用和分支。
有一个简单的解决方案吗?
如果你在 Linux 上,你应该能够通过cachegrind运行你的程序来获取指令计数。
也可以使用ollydbg的 Run Trace 函数来获取指令计数,但这可能会受到内存的限制。
或者,可以编写一个简单的单步运行程序的小型调试器。
用于跟踪系统调用的原始工具是特定于平台的。
truss
或dtrace
dtrace
strace
tusc
truss
例如(Solaris):
truss -o ls.truss ls $HOME
这将捕获所有系统调用,ls
因为它列出了您的主目录。
OTOH,这可能不是您想要的……在这种情况下,它的价值有限。
这是非常特定于硬件的,但大多数处理器都提供了一种工具,可以计算流经它们的机器指令(和其他事件)的确切数量。这就是分析器如何捕获诸如缓存未命中之类的事情:通过查询这些内部寄存器。
PAPI 库提供在各种主要处理器上查询此数据的调用。如果您使用的是 Linux+x86,PerfSuite 为您提供了一些更高级的工具,这些工具可能更容易上手。
英特尔有一个监控应用程序,您可以使用它来实时观察芯片的内部计数器,他们的性能分析指南描述了芯片上的各种性能监控单元以及如何读取它们。