2

I've got a simple .c file:

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

I tried to compile it with "-Og" to enable debug information. GCC man says

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

But when I use "gdb a.out" and try "list", it says:

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

Well this is so weird as out of my expectation, If I use gcc a.c -g, "list" is fine in gdb. Why is that?

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Troskyvs
  • 7,537
  • 7
  • 47
  • 115

1 Answers1

3

-Og is optimization switch. It enables any optimizations that don't interfere with debugging, but says nothing about debug information.

-g enables debug information (which is usually a separate non-code section).

So, use -Og -g or similar, to enable debug information and debug optimizations.

Your build with -g only enabled debug information, but left optimization at default level (which is completely disabled).

More information about debug options in GCC manual, including this: "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."

dbrank0
  • 9,026
  • 2
  • 37
  • 55