最近更新了GCC 4.8的文档,现在引入了一个新的优化开关-Og
。此
[..]解决了快速编译和卓越调试体验的需求,同时提供了合理的运行时性能。总体开发经验应优于默认优化级别-O0。
此切换是否意味着-g
或我是否必须手动将其添加到CXXFLAGS
?
答案 0 :(得分:24)
在GCC 4.9.2源代码(gcc / opts.c)中查看显示-Og
与-O1
相同,但禁用了某些标记可能导致更糟糕的调试经验:
/* 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_DEBUG
时,系统不会启用标有OPT_LEVELS_1_PLUS_SPEED_ONLY
,OPT_LEVELS_2_PLUS_SPEED_ONLY
和-Og
的选项。
所以这就是声明“应该比-O0更好”的地方。 -Og
介于-O0
和-O1
之间。这不会影响包含将通过-g
选项启用的调试信息。您可能也会对不同的-g
选项感兴趣:
-ggdb
会覆盖-g
。也就是说,如果您在-ggdb
之后设置-g
,则-g
选项会被有效忽略。-g
等于-g2
,省略-g
与-g0
相同。-g3
产生的调试部分比-g2
更大,-ggdb3
对-ggdb2
也是如此。-O0
< -O1
< -Og
< -O2
< -O3
}。strip --strip-debug
导致相同的对象大小独立于-g
级别。这符合期望只有-O
级别对-g
确定调试部分的实际代码有影响。strip --keep-debug
会产生尺寸由-g
级别控制的对象,后跟-O
级别。 (因此-g0 -O3
小于-g3 -O0
)。注意:这里我没有考虑编译的时间。随着更积极的优化级别,它可能会增加。我希望调试级别只会对时间产生轻微影响(与优化相比),因为它只是意味着在传递过程中需要跟踪额外的细节。
这是我用来测试实际行为的命令(也比较-ggdbX
而不是-gX
):
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
答案 1 :(得分:15)
简短回答:不,您仍必须手动添加-g
。
答案很长:
我一直努力直接从源头找到答案,所以我决定使用此处描述的方法自行测试:How to check if program was compiled with debug symbols?
我使用-O3
标记构建了一个可执行文件而没有-g
。正如预期的那样,使用objdump --syms <file> | grep debug
没有产生任何结果。
然后我用-g
构建了一个可执行文件,没有任何优化标志。相同的objdump
命令产生了六个结果,例如:
0000000000000000 l d .debug_info 0000000000000000 .debug_info
我最终使用-Og
标记构建了一个可执行文件而没有-g
。 objdump
命令没有产生任何结果。这意味着在这种情况下调试符号不。
虽然我找不到GCC本身的任何明确文件,但Gentoo Wiki(如之前由Marco Scannadinari所述)证实了我的断言-Og
并不暗示-g
。
答案 2 :(得分:0)
fedora 29 工作站 x86_64 上的 gcc --version gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)
手册。
不同的版本,但我认为它很有帮助。
<块引用>调试程序的选项
...
If you are not using some other optimization option, consider using -Og with -g. With no -O option at
all, some compiler passes that collect information useful for debugging do not run at all, so that -Og may
result in a better debugging experience.
...
<块引用>
控制优化的选项
...
-Og Optimize debugging experience. -Og enables optimizations that do not interfere with debugging. It
should be the optimization level of choice for the standard edit-compile-debug cycle, offering a
reasonable level of optimization while maintaining fast compilation and a good debugging experience.
...
因此,我们可以看到 -Og
是优化选项之一。 如果您不使用其他优化选项,请考虑使用 -Og 和 -g。
示例:
#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;
}
编译:
[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
然后就可以看到编译文件的大小了:
[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 readelf version 2.31.1-13.fc29) 重新检查这些文件中的调试信息。
[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
:
--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes, =trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links,=follow-links]
您可以使用 gdb 来检查:
[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 文档,Debugging-Options 部分未提及 -Og
,仅在 Optimize-Options 部分引入。