使用Pin、Perf和Valgrind计算二进制文件执行的指令数量

5

我刚接触 pin 工具,这是一种用于动态二进制插装的工具。我正在尝试使用pin工具API编写一些简单的客户端程序。其中一个简单的客户端程序是计算给定二进制文件执行的指令数,这是pin示例之一。
我用C语言编写了一个非常基本的程序,

int main(){return 0;}

使用gcc编译的程序,当我使用pin工具来计算上述C程序的指令数时,它给出了答案96072
当我使用valgrind执行相同任务时,它给出了近似于前一个的97487的答案。但是,当我使用perf时,答案则是421,256。 各种工具之间差异的原因是什么呢?
为了找到更多细节,我将C程序编译为x86汇编,并包含约20-30行汇编指令。但是,当我使用objdump来反汇编二进制文件时,结果是200-300行汇编指令。我也无法弄清楚这种差异的原因。 我正在运行64位Ubuntu 12.04,Linux内核版本为3.8.0-39。提前感谢。

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7
当我使用valgrind执行相同的任务时,它给出了近似于之前的97487的答案。但是当我使用perf时,答案是421,256。各种工具之间存在差异的原因是什么? 我猜测perf会给您提供用户和内核模式指令(这是默认设置)。请尝试。
    perf stat -e instructions:u your_executable

这个计数器只计算在用户模式下执行的指令。更多细节请参见perf教程

为了找到更多细节,我已经将C程序编译成x86汇编代码,它包含大约20-30行汇编指令,但是当我使用objdump反汇编二进制文件时,结果是200-300行汇编指令。我无法找出这种差异的原因。

在第一种情况下,你只会得到专门针对你的代码的汇编指令。而在第二种情况下,你会得到可执行文件中所有的指令。请编译。

    int main() { }

需要运行objdump -d 可执行文件名。您会发现,在执行main()之前会发生很多事情;在main()执行完毕后,将执行清理工作。

Linux x86程序启动或-我们如何到达main()?看起来是一个不错的教程。


你好,当我在我的Python应用程序上执行'perf stat -e instructions:u python MyPythonApp.py'时,它显示0条指令,你认为可能是什么原因?谢谢。 - mozcelikors
更新:对于 CPP 应用程序,它没有提供任何指令。 - mozcelikors
@mozcelikors,很抱歉我不知道。由于该命令在我的机器上可以运行,所以我也无法弄清楚问题所在。请发布一个新问题,说明该命令应该可以工作,但出于某种原因,在您的机器上无法工作。也许其他人可以给您一些提示。 - Ali
感谢您的友好和快速回复。我现在正在使用虚拟机,也许它可以在真实的机器上运行? - mozcelikors
@mozcelikors 是的,这可能是问题所在。请尝试在真实的机器上运行它。 - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,