我正在尝试了解使用-pg
编译C代码时-p
(或gcc
)标记的工作原理。
官方gcc文档only states:
-pg
生成额外的代码以编写适用于分析程序gprof的配置文件信息。在编译想要数据的源文件时,必须使用此选项,并且在链接时也必须使用它。
这真让我感兴趣,因为我正在对剖析器进行一项小型研究 - 试图选择最适合这项工作的工具。
答案 0 :(得分:19)
使用-pg
工具编译您的代码,以便gprof
报告详细信息,请参阅gprof's manual, 9.1 Implementation of Profiling
分析通过改变程序中每个函数的编译方式来工作,这样当它被调用时,它会隐藏一些关于调用它的位置的信息。由此,探查器可以找出调用它的函数,并可以计算它被调用的次数。当您的程序使用
-pg
选项进行编译时,编译器会进行此更改,这会导致每个函数调用mcount
(或_mcount
或__mcount
,具体取决于操作系统和编译器)作为其首批操作之一。包含在概要分析库中的
mcount
例程负责在内存调用图表中记录其父例程(子代)及其父代的父代。这通常通过检查堆栈帧来查找子项的地址和原始父项中的返回地址来完成。由于这是一个非常依赖于机器的操作,mcount
本身通常是一个简短的汇编语言存根例程,它提取所需的信息,然后用两个参数调用__mcount_internal
(一个普通的C函数) - { {1}}和frompc
。selfpc
负责维护内存中的调用图,该图记录__mcount_internal
,frompc
以及遍历每个调用弧的次数。...
请注意,使用这样的仪器分析器,您可以分析在发布时编译的相同代码,而无需分析检测。与检测代码本身相关的开销。此外,检测代码可能会改变指令和数据缓存的使用。
与仪表分析器相反,像Intel VTune这样的采样分析器通过使用操作系统中断定期查看目标程序的程序计数器来处理非检测代码。它还可以查询特殊的CPU寄存器,以便更深入地了解正在发生的事情。
答案 1 :(得分:6)
答案 2 :(得分:0)
从此来源:https://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf:
" 仪表主要有两个 forms-显式声明的跟踪点和隐式跟踪点。 显式跟踪点由开发人员定义 声明指定的位置 tracepoint,以及有关哪些数据的其他信息 应该在特定的跟踪站点收集。含蓄 跟踪点由代码自动放入代码中 编译器,由于编译器标志或开发人员 重新定义常用的宏。
隐式地修改功能,何时 内核配置为支持函数跟踪, 内核构建系统将-pg添加到用于的标志 编译器。这会导致编译器添加代码 每个函数的序言,它调用一个特殊的程序集 例程叫做mcount。这个编译器选项是 专门用于分析和跟踪 目的。 "