编译器中的-p和-g标志是什么

我一直在分析C代码,为此我用-p和-g标志编译。 所以我在徘徊这些标志实际上做了什么以及它们添加到二进制文件的开销是多少? 谢谢

-pprof提供信息, -pggprof提供信息。

我们来看看后者。 这是gprof如何工作的解释 ,但让我在这里压缩它。

当用-pg编译例程B时,会在例程的入口点插入一些代码,查找哪个例程正在调用它,比如A.然后它递增一个计数器,表示A调用了B.

然后,当代码执行时,发生了两件事。 首先是那些计数器正在增加。 第二个是定时器中断正在发生,并且每个例程都有一个计数器,说明当PC处于例程中时发生了多少中断。

定时器中断以一定的速率发生,例如每秒100次。 然后,例如,如果例程中发生了676次中断,您可以判断它的“自我时间”大约是6.76秒,分散在对它的所有调用上。

通话计数允许你做的是将它们加起来告诉例程被调用多少次,这样你就可以把它分成它的总自我时间来估计每次通话的自我时间。 然后你可以开始估计“累积时间”。 这是在例程中花费的时间,加上它调用的例程所花费的时间,依此类推到调用树的底部。

从1982年开始,这就是所有有趣的技术,但如果您的目标是找到加速计划的方法, 那么它就会遇到很多问题 。

假设您正在使用GCC,您可以从GCC手册中获得此类信息

http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

-p

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

-G

以操作系统的本机格式(stabs,COFF,XCOFF或DWARF 2)生成调试信息。 GDB可以使用此调试信息。

在大多数使用stabs格式的系统上,-g允许使用只有GDB才能使用的额外调试信息; 这些额外的信息使得调试在GDB中工作得更好,但可能会使其他调试器崩溃或拒绝读取程序。 如果要确定是否要生成额外信息,请使用-gstabs +, – gstabs,-gxcoff +, – gxcoff或-gvms(参见下文)。

GCC允许您使用-g和-O。 优化代码所采用的快捷方式有时会产生令人惊讶的结果:您声明的某些变量可能根本不存在; 控制流可能会短暂地移动到你没想到的地方; 某些陈述可能无法执行,因为它们会计算出不变的结果,或者它们的值已经存在; 一些语句可能在不同的地方执行,因为它们被移出循环。

然而,它certificate可以调试优化的输出。 这使得将优化程序用于可能存在错误的程序是合理的。