我试图了解使用 GCC 编译 C 代码时
-pg
(或 -p
)标志如何工作。
GCC 官方文档仅说明:
生成额外的代码来编写适合分析程序 gprof 的配置文件信息。在编译您想要数据的源文件时必须使用此选项,并且在链接时也必须使用它。-pg
这真的让我很感兴趣,因为我正在对分析器进行一些小研究。我正在尝试选择最适合这项工作的工具。
使用 -pg 编译您的代码,以便 Gprof 报告详细信息。请参阅 gprof 手册,9.1 分析实施:
分析的工作原理是更改程序中每个函数的编译方式,以便在调用它时,它会隐藏一些有关其调用位置的信息。由此,分析器可以找出哪个函数调用了它,并可以计算它被调用的次数。当使用
选项编译程序时,编译器会进行此更改,这会导致每个函数调用-pg
(或mcount
,或_mcount
,具体取决于操作系统和编译器)作为其函数之一第一次手术。__mcount
例程包含在分析库中,负责在内存调用图表中记录其父例程(子例程)及其父例程的父例程。这通常是通过检查堆栈帧以查找子级的地址以及原始父级中的返回地址来完成的。由于这是一个非常依赖于机器的操作,因此mcount
本身通常是一个简短的汇编语言存根例程,用于提取所需的信息,然后使用两个参数 —mcount
和__mcount_internal
调用frompc
(普通 C 函数)。selfpc
负责维护内存中的调用图,其中记录了__mcount_internal
、frompc
,以及这些调用弧被遍历的次数。selfpc
...
请注意,使用这样的检测分析器,您将分析在发布中编译的相同代码,而无需分析检测。检测代码本身会产生一定的开销。此外,检测代码可能会改变指令和数据缓存的使用。
与插装分析器相反,像Intel VTune这样的采样分析器通过使用操作系统中断定期查看目标程序的程序计数器来处理非插装代码。它还可以查询特殊的 CPU 寄存器,让您更深入地了解正在发生的情况。
另请参阅分析器检测与采样。
来自 ”使用 Ftrace 测量功能持续时间”:
仪器主要有两种 形式——显式声明的跟踪点和隐式跟踪点。
显式跟踪点由开发人员定义的 指定位置的声明 跟踪点以及有关数据的附加信息 应在特定的跟踪站点收集。隐含的 由于编译器标志或开发人员对常用宏的重新定义,跟踪点由编译器自动放入代码中。
隐式地检测函数,当 内核配置为支持函数跟踪,内核构建系统将 -pg 添加到与 编译器。这会导致编译器将代码添加到 每个函数的序言,它调用一个名为 mcount 的特殊汇编例程。这个编译器选项是 专门用于分析和跟踪 目的。