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

时间:2011-12-07 21:17:02

标签: c profiling

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

2 个答案:

答案 0 :(得分:5)

假设您正在使用GCC,您可以从GCC手册

获取此类信息

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

-p

  

生成额外的代码来编写适合的配置文件信息   分析计划prof。编译时必须使用此选项   您想要数据的源文件,您还必须在使用它时使用它   联。

-g

  

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

     

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

     

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

     

然而,事实证明可以调试优化的输出。这使得将优化器用于可能具有的程序是合理的   错误。

答案 1 :(得分:4)

-p提供prof的信息,-pg提供gprof的信息。

让我们来看看后者。 Here's an explanation of how gprof works, 但是让我在这里浓缩一下。​​

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

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

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

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

这是所有有趣的技术,从1982年开始,但如果您的目标是找到加快计划速度的方法,it has a lot of issues