gcc的-pg标志如何工作?

Tre*_*or 22 gcc compilation compiler-flags gprof

我试图了解编译C代码时-pg(或-p)标志如何工作gcc.

官方gcc文档仅说明:

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

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

Gre*_*osz 19

使用-pg仪器编译代码以便gprof报告详细信息,请参阅gprof的手册,9.1实现性能分析

分析通过改变程序中每个函数的编译方式来工作,这样当它被调用时,它会隐藏一些关于调用它的位置的信息.由此,探查器可以找出调用它的函数,并可以计算它被调用的次数.当您使用该-pg选项编译程序时,编译器会进行此更改,这会导致每个函数调用mcount(或者_mcount,或者__mcount,取决于操作系统和编译器)作为其第一个操作之一.

mcount包含在概要分析库中的例程负责在内存调用图表中记录其父例程(子代)及其父代的父代.这通常通过检查堆栈帧来查找子项的地址和原始父项中的返回地址来完成.由于这是一个非常依赖于机器的操作中,mcount本身通常是提取所需的信息,然后调用一个短汇编语言存根例程__mcount_internal(一个普通的C函数)有两个arguments- frompcselfpc.__mcount_internal负责维持存储器内调用图,其中记录frompc,selfpc和的次数每个呼叫弧被遍历.

...

请注意,使用这样的仪器分析器,您将分析您在发布时编译的相同代码,而无需分析检测.与检测代码本身相关的开销.此外,检测代码可能会改变指令和数据高速缓存的使用.

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

另请参见Profilers检测Vs采样


Mik*_*vey 6

此链接简要说明了gprof的工作原理.

这个链接对它进行了广泛的批评.(查看我对存档问题的回答.)