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

Why gcc -Og doesn't generate source code-line mapping?

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

$ cat a.c
int i=0;
int j;
static int l=4;
void k(){}
void main(){
  k();
}

我试图用“-Og”编译它以启用调试信息。海湾合作委员会的人说

-Og Optimize debugging experience.
-Og enables optimizations that do not interfere with debugging.

但是当我使用 "gdb a.out" 并尝试 "list" 时,它说:

(gdb) l
No symbol table read. Please use "file" command.

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

-Og 是优化开关。它启用任何不干扰调试的优化,但不说明调试信息。

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

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

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

有关调试选项的更多信息 in GCC manual,包括: "If you are not using some other optimization option, consider using -Og (see Optimize Options) 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."