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

Syn*_*ror 6 c profiling

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

hug*_*omg 5

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

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


Mik*_*vey 5

-p提供信息prof,并-pg提供信息gprof

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

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

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

定时器中断以一定的速率发生,例如每秒 100 次。然后,例如,如果例程中发生了 676 个中断,您可以看出它的“自身时间”约为 6.76 秒,分布在对其的所有调用中。

调用计数允许您做的是将它们相加,以了解例程被调用的次数,因此您可以将其除以总的自我时间来估计每次调用的自我时间。然后你就可以开始估计“累积时间”。这是在例程中花费的时间,加上在它调用的例程中花费的时间,依此类推直到调用树的底部。

这是 1982 年的有趣技术,但如果您的目标是找到加速程序的方法,那么它就会存在很多问题