【问题标题】:what does the -p and -g flag in compiler编译器中的 -p 和 -g 标志是什么
【发布时间】:2012-01-15 09:34:26
【问题描述】:

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

【问题讨论】:

标签: c profiling


【解决方案1】:

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

尽管如此,调试优化输出被证明是可能的。这使得将优化器用于可能具有的程序是合理的 错误。

【讨论】:

  • 在 Unix 系统上也可以通过 info gcc 方便地获得。
  • @missingno:谢谢这看起来很有用!但是我正在寻找更深入的信息,例如 -p,它会生成额外的代码,额外的代码是什么?
  • @Syntax_Error:查找有关 prof 的信息,例如我从 Google 搜索中找到的此链接:dartmouth.edu/~rc/classes/soft_dev/profiling.html。此外,如果这实际上是编译器正在谈论的问题,请将 gcc 添加到您的问题中。
【解决方案2】:

-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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2021-07-31
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多