我是 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。提前谢谢。
答案 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()?似乎是一个很好的教程。