【问题标题】:How does gcc's -pg flag work?gcc 的 -pg 标志是如何工作的?
【发布时间】:2011-11-09 13:07:56
【问题描述】:

我试图了解使用gcc 编译C 代码时-pg(或-p)标志的工作原理。

gcc官方文档only states

-pg
生成额外的代码来编写适合分析程序 gprof 的配置文件信息。在编译需要数据的源文件时必须使用此选项,并且在链接时也必须使用它。

这真的让我很感兴趣,因为我正在对分析器进行一项小型研究 - 试图选择最适合这项工作的工具。

【问题讨论】:

    标签: gcc compilation gprof compiler-flags


    【解决方案1】:

    使用-pg 编译您的代码,以便gprof 报告详细信息,请参阅gprof's manual, 9.1 Implementation of Profiling

    分析通过改变程序中每个函数的编译方式来工作,以便在调用它时,它会隐藏一些关于它从哪里调用的信息。由此,分析器可以找出调用它的函数,并且可以计算它被调用了多少次。当您的程序使用-pg 选项编译时,编译器会进行此更改,这会导致每个函数调用mcount(或_mcount,或__mcount,具体取决于操作系统和编译器)作为它的一个第一次操作。

    分析库中包含的mcount 例程负责在内存调用图表中记录其父例程(子例程)及其父例程的父例程。这通常通过检查堆栈帧来找到子地址和原始父节点的返回地址来完成。由于这是一个非常依赖于机器的操作,mcount 本身通常是一个简短的汇编语言存根例程,它提取所需的信息,然后用两个参数调用__mcount_internal(一个普通的 C 函数)——frompc 和 @ 987654334@。 __mcount_internal 负责维护内存调用图,它记录了frompcselfpc,以及这些调用弧中每一个被遍历的次数。

    ...

    请注意,使用这样的检测分析器,您将在没有配置分析检测的情况下对发布时编译的相同代码进行分析。有与检测代码本身相关的开销。此外,检测代码可能会改变指令和数据缓存的使用。

    与检测分析器相反,像Intel VTune 这样的采样分析器通过使用操作系统中断定期查看目标程序的程序计数器来处理非检测代码。它还可以查询特殊的 CPU 寄存器,让您更深入地了解正在发生的事情。

    另见Profilers Instrumenting Vs Sampling

    【讨论】:

      【解决方案2】:

      This link 简要说明了 gprof 的工作原理。

      This link 对其进行了广泛的批评。 (查看我对存档问题的回答。)

      【讨论】:

      • 自从阅读这些文件以来,我几乎一直在使用 gdb 中的 break 和 backtrace 进行所有速度分析。
      • @David:我有很多关于它的争论,但我确实用它this example。 700 倍加速。我并不是说暂停很漂亮,但据我所知,没有人以其他方式得到这样的结果。
      • @duedl0r:更新了链接。
      【解决方案3】:

      来自此来源:https://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf

      " 仪表主要有两个 形式——显式声明的跟踪点和隐式的跟踪点。 显式跟踪点由开发人员定义 指定位置的声明 跟踪点,以及有关哪些数据的其他信息 应在特定的跟踪站点收集。隐式 跟踪点由 编译器,由于编译器标志或开发人员 重新定义常用宏。

      隐式地检测函数,当 内核被配置为支持函数跟踪, 内核构建系统将 -pg 添加到与 编译器。这会导致编译器将代码添加到 每个函数的序言,它调用一个特殊的程序集 例程称为 mcount。这个编译器选项是 专门用于分析和跟踪 目的。 "

      【讨论】:

        猜你喜欢
        • 2019-02-17
        • 1970-01-01
        • 2015-07-10
        • 2015-11-21
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2023-03-10
        相关资源
        最近更新 更多