首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC 4.8:-Og是否意味着-g?

GCC 4.8:-Og是否意味着-g?
EN

Stack Overflow用户
提问于 2012-10-19 08:49:52
回答 3查看 11.9K关注 0票数 34

最近,GCC 4.8的文档被更新,现在引入了一个新的优化开关,-Og。这

。。满足快速编译和优秀调试体验的需要,同时提供合理水平的运行时性能。开发的总体经验应该优于默认的优化级别-O0。

此开关是否意味着-g,还是必须手动将其添加到CXXFLAGS中?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-03 17:38:21

简短回答:不,您仍然必须手动添加-g

长答案

我一直在努力从源代码中直接找到一个很难的答案,所以我决定使用下面描述的方法来测试它:如何检查程序是否使用调试符号编译?

我用-O3标志构建了一个没有-g的可执行文件。正如预期的那样,使用objdump --syms <file> | grep debug没有产生任何结果。

然后,我用-g构建了一个没有任何优化标志的可执行文件。相同的objdump命令产生了6个结果,如下所示:

0000000000000000 l d .debug_info 0000000000000000 .debug_info

最后,我用-Og标志构建了一个没有-g的可执行文件。objdump命令没有产生任何结果。这意味着在这种情况下,调试符号是而不是

虽然我找不到GCC本身的任何明确文档,但Gentoo维基 (正如Marco前面提到的那样)证实了我的断言,即-Og并不意味着-g

票数 24
EN

Stack Overflow用户

发布于 2014-11-22 10:25:36

查看GCC 4.9.2源代码(gcc/opts.c)表明,-Og-O1相同,但是禁用了一些标志,可能会导致更糟糕的调试体验:

代码语言:javascript
复制
/* in function default_options_optimization: */
    case OPT_Og:
      /* -Og selects optimization level 1.  */
      opts->x_optimize_size = 0;
      opts->x_optimize = 1;
      opts->x_optimize_fast = 0;
      opts->x_optimize_debug = 1;
      break;

几步后,函数maybe_default_option将使用一组选项和x_optimize_debug标志进行调用。使用OPT_LEVELS_1_PLUS_NOT_DEBUGOPT_LEVELS_1_PLUS_SPEED_ONLYOPT_LEVELS_2_PLUS_SPEED_ONLY标记的选项将不会启用。

因此,这就是“应该比-O0更好”这句话的来源。-Og介于-O0-O1之间。这不影响将通过-g选项启用的调试信息的包含。您可能还会对不同的-g选项感兴趣:

  • 选项-ggdb覆盖-g。也就是说,如果您在-g之后设置了-g,那么-g选项实际上会被忽略。
  • 选项-g等于-g2,省略-g-g0相同。
  • 选项-g3会产生比-g2更大的调试部分,而针对-ggdb2-ggdb3也会产生更大的调试部分。
  • 更高的优化级别都会导致代码和调试部分的增加。(-O0 < -O1 < -Og < -O2 < -O3)。
  • strip --strip-debug导致的对象大小与-g级别无关。这与这样的期望相匹配,即只有-O级别对实际代码有影响,-g在其中确定调试部分。
  • strip --keep-debug的结果是对象的大小由-g级别主导,其次是-O级别。(因此-g0 -O3-g3 -O0小)。

注意:这里我没有考虑编译的时间。随着更积极的优化水平的提高,它可能会增加。我认为调试级别对时间的影响很小(与优化相比),因为这仅仅意味着需要在传递过程中跟踪额外的细节。

下面是用于测试实际行为的命令(还比较了-ggdbX而不是-gX):

代码语言:javascript
复制
for g in -g0 -g2 -g3;do
    for O in -O0 -O1 -O2 -O3 -Og; do
        flags="$g $O";
        gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break;
    done;
done
票数 43
EN

Stack Overflow用户

发布于 2021-08-10 12:02:01

gcc --version gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)在fedora 29工作站x86_64上的操作手册

不同的版本,但我认为这是有帮助的。

调试程序的选项 ..。如果您没有使用其他优化选项,请考虑将-Og与-g结合使用。如果根本没有-O选项,一些收集对调试有用的信息的编译器就根本不会运行,因此-Og可能会带来更好的调试体验。..。控制优化的选项 . -Og优化调试经验。-Og支持不影响调试的优化。它应该是标准编辑编译调试周期的最优选择,在保持快速编译的同时提供合理的优化水平和良好的调试经验。..。

因此,我们可以看到-Og是优化选项之一。如果您没有使用其他优化选项,请考虑将-Og与-g结合使用。

示例:

代码语言:javascript
复制
#include <stdio.h>

int main(int argc, char *argv[]) {
    int n;

    for (n=0; n<10; n++) {
       printf("Print Number: %d\n", n);
    }
    return 0;
}

汇编:

代码语言:javascript
复制
[user@localhost myctest]$ gcc sample.c -o sample
[user@localhost myctest]$ gcc sample.c -o sample.Og -Og
[user@localhost myctest]$ gcc sample.c -o sample.g -g
[user@localhost myctest]$ gcc sample.c -o sample.Og.g -Og -g

然后您可以看到编译后的文件的大小:

代码语言:javascript
复制
[user@localhost myctest]$ ls -l --human-readable sample*
-rwxrwxr-x. 1 user user 18K Aug 10 19:43 sample
-rw-rw-r--. 1 user user 162 Aug 10 19:43 sample.c
-rwxrwxr-x. 1 user user 21K Aug 10 19:43 sample.g
-rwxrwxr-x. 1 user user 18K Aug 10 19:43 sample.Og
-rwxrwxr-x. 1 user user 21K Aug 10 19:44 sample.Og.g

然后可以使用readelf(GNU版本2.31.1-13.fc 29)重新检查这些文件中的调试信息。

代码语言:javascript
复制
[user@localhost myctest]$ readelf --debug-dump=aranges sample
[user@localhost myctest]$ readelf --debug-dump=aranges sample.g
Contents of the .debug_aranges section:

  Length:                   44
  Version:                  2
  Offset into .debug_info:  0x0
  Pointer Size:             8
  Segment Size:             0

    Address            Length
    0000000000401126 000000000000003d 
    0000000000000000 0000000000000000 

[user@localhost myctest]$ readelf --debug-dump=aranges sample.Og
[user@localhost myctest]$ readelf --debug-dump=aranges sample.Og.g
Contents of the .debug_aranges section:

  Length:                   44
  Version:                  2
  Offset into .debug_info:  0x0
  Pointer Size:             8
  Segment Size:             0

    Address            Length
    0000000000401126 0000000000000028 
    0000000000000000 0000000000000000 

您可以看到,只有-Og选项编译的文件中没有调试信息。您还可以使用readelf --debug-dump=选项检查更多信息。例如,readelf --debug-dump=aranges,info sample.g。和readelf --headers sample.g | grep debug

请参阅man readelf

-调试-dump=rawline,=decodedline,=info,=缩写,=pubname,=aranges,=宏,=frames,=frames,=str,=loc,=Ranges,=pubtype,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links,=跟随-links

您可以使用gdb检查:

代码语言:javascript
复制
[user@localhost myctest]$ gdb sample.Og
GNU gdb (GDB) Fedora 8.2-3.fc29
Copyright (C) 2018 Free Software Foundation, Inc.
...

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from sample.Og...(no debugging symbols found)...done.
(gdb) 

然后为文件获取(no debugging symbols found),sample.Og。

4.8.x

对于4.8.x文档,-Og没有在调试-选项一节中提到,而只是在优化-选项部分中介绍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12970596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档