【问题标题】:Counting number of instructions executed by a binary using pin, perf and valgrind使用 pin、perf 和 valgrind 计算二进制执行的指令数
【发布时间】:2014-06-10 23:12:24
【问题描述】:

我是用于动态二进制检测的 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汇编指令行。我也无法弄清楚这种差异的原因。 我正在运行带有 Linux 内核版本 3.8.0-39 的 64 位 Ubuntu 12.04。提前致谢。

【问题讨论】:

    标签: c assembly valgrind x86-64 perf


    【解决方案1】:

    当我使用 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()? 似乎是一个不错的教程。

    【讨论】:

    • 你好,当我在我的 python 应用程序上执行 'perf stat -e instructions:u python MyPythonApp.py' 时,它给出了 0 条指令,你认为为什么会这样?谢谢
    • 更新:它还为 CPP 应用程序提供了 0 条指令。
    • @mozcelikors 我不知道,对不起。由于该命令在我的机器上有效,因此我也无法弄清楚。请发布一个新问题,说该命令应该可以工作,但由于某种原因,它在 your 机器上不起作用。也许其他人可以给你提示。
    • 感谢您的友好和快速回复。我现在用的是虚拟机,能不能在真机上运行?
    • @mozcelikors 是的,这可能是问题所在。请在真机上试用。
    猜你喜欢
    • 2012-04-03
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2014-07-18
    • 2021-12-14
    • 2014-01-05
    相关资源
    最近更新 更多