Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GDB says "no symbol table," but nm shows file has debug symbols

Tags:

I'm trying to debug a simple C project using GDB, but GDB can't seem to find the debug symbols for the program no matter how I compile it.

When I load the program into GDB, it claims to have read the symbols successfully because it prints

Reading symbols from /home/edward/<executable>...done.

However, when I run the program, break on a segmentation fault, and type info locals, it says

No symbol table info available.

Also, bt shows that execution stopped inside a function I wrote (not a system or library call), but there is no line number information, just raw memory addresses.

Why can't GDB find or use the symbols it successfully read earlier? I've run nm and objdump on the binary file I'm running, and they both show sections like .debug_info, .debug_line, so the file does in fact contain debugging symbols.

I usually compile with a Makefile that sets the following flags:

CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall

which I can see are being used when make invokes gcc. However, I've tried changing to just -g, and compiling manually by invoking gcc -g -O0 on a simple test file, and the result is still the same: the binary file contains debug symbols, and GDB reads them, but invoking any GDB command results in a message that debug information is not available.

Updates

I'm running Ubuntu 12.04, my GDB version is 7.4, and my GCC version is 4.8.1.

If I set complaints 10000 in GDB and then load the file, it prints the following complaints:

Reading symbols from /home/edward/<snip>/minithread...
DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE at 0x205 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x4006c3 is not < DW_AT_high_pc 0xa9 for DIE at 0x235 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x40076c is not < DW_AT_high_pc 0xad for DIE at 0x287 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400819 is not < DW_AT_high_pc 0xe7 for DIE at 0x2d3 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400900 is not < DW_AT_high_pc 0x4f for DIE at 0x345 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x40094f is not < DW_AT_high_pc 0x55 for DIE at 0x39d [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x4009a4 is not < DW_AT_high_pc 0x38 for DIE at 0x3e7 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x4009dc is not < DW_AT_high_pc 0x43 for DIE at 0x433 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400a20 is not < DW_AT_high_pc 0x2e for DIE at 0x56c [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400a4e is not < DW_AT_high_pc 0x2e for DIE at 0x5aa [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400a7c is not < DW_AT_high_pc 0x29 for DIE at 0x5d4 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400aa5 is not < DW_AT_high_pc 0x49 for DIE at 0x620 [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400aee is not < DW_AT_high_pc 0xca for DIE at 0x66c [in module /home/edward/<snip>/minithread]
...DW_AT_low_pc 0x400bb8 is not < DW_AT_high_pc 0x7bb for DIE at 0x6f0 [in module /home/edward/<snip>/minithread]...done.

Are these errors the cause of the problem? Do they mean my GDB is the "wrong" version?

like image 236
Edward Avatar asked Oct 07 '13 16:10

Edward


People also ask

How do I add a symbol table in gdb?

To add additional symbols you might use add-symbol-file . The add-symbol-file command reads additional symbol table information from the file filename. You would use this command when filename has been dynamically loaded (by some other means) into the program that is running.

How do I get rid of debug symbols?

To remove debugging symbols from a binary (which must be an a. out or ELF binary), run strip --strip-debug filename. Wildcards can be used to treat multiple files (use something like strip --strip-debug $LFS/tools/bin/*).

How do I know if a file has debugging symbols?

To check if there's debug info inside the kernel object, you can add the following at the end of the objdump command: | grep debug . If this string is found, you know the kernel object contains debug information. If not, then it's a "clean" kernel object.

What are debugging symbols in gdb?

A Debugging Symbol Table maps instructions in the compiled binary program to their corresponding variable, function, or line in the source code. This mapping could be something like: Program instruction ⇒ item name, item type, original file, line number defined.


2 Answers

gcc 4.8.1 generates dwarf4 debug info which gdb 7.4 can't understand. You need to install gdb 7.6

like image 65
Chris Dodd Avatar answered Oct 31 '22 11:10

Chris Dodd


In addition to Chris Dodd's answer, you can also compile your code with gcc -gdwarf-3, which compiles with dwarf3 debug info. Which is compatible with your GDB version.

like image 29
Robert Avatar answered Oct 31 '22 12:10

Robert