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

时间:2016-10-19 03:46:12

标签: gcc gdb mapping symbol-table

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

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

我尝试使用“-Og”编译它以启用调试信息。海湾合作委员会男子说

  

-Og优化调试体验       -Og启用不会干扰调试的优化。

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

  

(gdb)l
      没有符号表读。请使用“file”命令。

这是非常奇怪的,如果我使用gcc a.c -g,“list”在gdb中很好。 那是为什么?

1 个答案:

答案 0 :(得分:3)

-Og是优化开关。它支持任何不干扰调试的优化,但对调试信息一无所知。

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

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

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

有关调试选项in GCC manual的更多信息,包括: “如果你没有使用其他一些优化选项,考虑使用-gg(参见优化选项)和-g。根本没有-O选项,一些编译器传递收集对调试有用的信息根本不运行,所以 - Og可能会带来更好的调试体验。“