使用pin,perf和valgrind计算二进制文件执行的指令数

时间:2014-04-25 09:51:41

标签: c assembly valgrind x86-64 perf

我是 pin 工具的新手,该工具用于动态二进制检测。我试图使用pin工具API编写一些简单的客户端程序。一个这样的简单客户端是计算二进制文件的执行指令的数量,该指令作为引脚的一个例子给出 我在C中写了一个非常基本的程序,

int main(){return 0;}

使用gcc编译器编译。当我使用pin工具计算用于上述C程序二进制文件的指令时,它给出了答案 96072
当我使用 valgrind 执行相同的任务时,它给了我 97487 的答案,它几乎等于前一个。但是当我使用性能时,答案是 421,256 各种工具之间出现这种差异的原因是什么? 为了找到更多细节,我已经将C程序编译成x86程序集,它包含大约20-30行汇编指令,但是当我使用 objdump 来反汇编二进制文件时,结果是200-300装配说明书。我也无法弄清楚这种差异的原因。 我使用Linux内核版本3.8.0-39运行64位Ubuntu 12.04。提前谢谢。

1 个答案:

答案 0 :(得分:7)

  

当我使用valgrind做同样的任务时,它给了我97487的答案,这几乎是   等于前一个。但是当我使用perf时,答案是421,256。   原因是什么?   各种工具之间的这种差异?

我的猜测是perf为您提供了用户内核模式指令(这是默认设置)。请尝试

    perf stat -e instructions:u your_executable

应该只计算在用户模式下执行的指令。 perf tutorial

中的更多详细信息
  

要查找更多详细信息,我已将C程序编译为x86程序集   它包含大约20-30行汇编指令,但是当我   使用objdump反汇编二进制,结果是200-300   装配说明书。我无法弄明白   造成这种差异的原因。

在第一种情况下,您只能获得专门用于代码的汇编指令 。在第二种情况下,您将获得可执行文件中包含的所有指令。请编译

    int main() { }

并运行objdump -d name_of_the_executable。正如您将看到的,许多事情发生在执行main()之前;在main()完成后,执行清理。

Linux x86 Program Start Up or - How the heck do we get to main()?似乎是一个很好的教程。