为什么gcc-Og不';是否生成源代码行映射?

为什么gcc-Og不';是否生成源代码行映射?,gcc,gdb,mapping,symbol-table,Gcc,Gdb,Mapping,Symbol Table,我有一个简单的.c文件: $ cat a.c int i=0; int j; static int l=4; void k(){} void main(){ k(); } 我试图用“-Og”编译它以启用调试信息。GCC的人说 -Og优化调试体验。 -Og支持不干扰调试的优化 但当我使用“gdb a.out”并尝试“list”时,它会说: (gdb)l 未读取符号表。请使用“文件”命令 这太奇怪了,出乎我的意料,如果我使用gcc a.c-g,“list”在gdb中就可以了。 为什么会这样?-

我有一个简单的.c文件:

$ cat a.c
int i=0;
int j;
static int l=4;
void k(){}
void main(){
  k();
}
我试图用“-Og”编译它以启用调试信息。GCC的人说

-Og优化调试体验。
-Og支持不干扰调试的优化

但当我使用“gdb a.out”并尝试“list”时,它会说:

(gdb)l
未读取符号表。请使用“文件”命令

这太奇怪了,出乎我的意料,如果我使用
gcc a.c-g
,“list”在gdb中就可以了。
为什么会这样?

-Og是优化开关。它支持任何不干扰调试的优化,但不涉及调试信息

-g启用调试信息(通常是单独的非代码部分)

因此,请使用-Og-g或类似工具来启用调试信息和调试优化

使用-g的构建只启用调试信息,但将优化保留在默认级别(完全禁用)

有关调试选项的详细信息,包括: “如果您没有使用其他优化选项,请考虑使用-Og(参见优化选项)-g。在没有-O选项的情况下,一些编译器通过收集有用的调试信息而不运行,因此-OG可能会导致更好的调试体验。”