开发者

no debugging symbols found when using gdb

GNU gdb Fedora (6.8-37.el5) Kernal 2.6.18-164.el5

I am trying to debug my application. However, everytime I pass the binary to the gdb it says:

(no debugging symbols found)

Here is the file output of开发者_如何学C the binary, and as you can see it is not stripped:

vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

I am compiling with the following CFLAGS:

CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code

Can anyone tell me if I am missing some simple here?


The most frequent cause of "no debugging symbols found" when -g is present is that there is some "stray" -s or -S argument somewhere on the link line.

From man ld:

   -s
   --strip-all
       Omit all symbol information from the output file.

   -S
   --strip-debug
       Omit debugger symbol information (but not all symbols) from the output file.


The application has to be both compiled and linked with -g option. I.e. you need to put -g in both CPPFLAGS and LDFLAGS.


Some Linux distributions don't use the gdb style debugging symbols. (IIRC they prefer dwarf2.)

In general, gcc and gdb will be in sync as to what kind of debugging symbols they use, and forcing a particular style will just cause problems; unless you know that you need something else, use just -g.


You should also try -ggdb instead of -g if you're compiling for Android!


Replace -ggdb with -g and make sure you aren't stripping the binary with the strip command.


I know this was answered a long time ago, but I've recently spent hours trying to solve a similar problem. The setup is local PC running Debian 8 using Eclipse CDT Neon.2, remote ARM7 board (Olimex) running Debian 7. Tool chain is Linaro 4.9 using gdbserver on the remote board and the Linaro GDB on the local PC. My issue was that the debug session would start and the program would execute, but breakpoints did not work and when manually paused "no source could be found" would result. My compile line options (Linaro gcc) included -ggdb -O0 as many have suggested but still the same problem. Ultimately I tried gdb proper on the remote board and it complained of no symbols. The curious thing was that 'file' reported debug not stripped on the target executable.

I ultimately solved the problem by adding -g to the linker options. I won't claim to fully understand why this helped, but I wanted to pass this on for others just in case it helps. In this case Linux did indeed need -g on the linker options.


Hope the sytem you compiled on and the system you are debugging on have the same architecture. I ran into an issue where debugging symbols of 32 bit binary refused to load up on my 64 bit machine. Switching to a 32 bit system worked for me.


Bazel can strip binaries by default without warning, if that's your build manager. I had to add --strip=never to my bazel build command to get gdb to work, --compilation_mode=dbg may also work.

$ bazel build -s :mithral_wrapped
... 
#even with -s option, no '-s' was printed in gcc command
...
$ file bazel-bin/mithral_wrapped.so
../cpp/bazel-bin/mithral_wrapped.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=4528622fb089b579627507876ff14991179a1138, not stripped
$ objdump -h bazel-bin/mithral_wrapped.so  | grep debug

$ bazel build -s :mithral_wrapped --strip=never
...
$ file bazel-bin/mithral_wrapped.so
bazel-bin/mithral_wrapped.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=28bd192b145477c2a7d9b058f1e722a29e92a545, not stripped
$ objdump -h bazel-bin/mithral_wrapped.so  | grep debug
 30 .debug_info   002c8e0e  0000000000000000  0000000000000000  0006b11e  2**0
 31 .debug_abbrev 000030f6  0000000000000000  0000000000000000  00333f2c  2**0
 32 .debug_loc    0013cfc3  0000000000000000  0000000000000000  00337022  2**0
 33 .debug_aranges 00002950  0000000000000000  0000000000000000  00473fe5  2**0
 34 .debug_ranges 00011c80  0000000000000000  0000000000000000  00476935  2**0
 35 .debug_line   0001e523  0000000000000000  0000000000000000  004885b5  2**0
 36 .debug_str    0033dd10  0000000000000000  0000000000000000  004a6ad8  2**0


For those that came here with this question and who are using Qt: in the release config there is a step where the binary is stripped as part of doing the make install. You can pass the configuration option CONFIG+=nostrip to tell it not to:

Instead of:

qmake <your options here, e.g. CONFIG=whatever>

you add CONFIG+=nostrip, so:

qmake <your options here, e.g. CONFIG=whatever> CONFIG+=nostrip


The solutions I've seen so far are good:

  1. must compile with the -g debugging flag to tell the compiler to generate debugging symbols
  2. make sure there is no stray -s in the compiler flags, which strips the output of all symbols.

Just adding on here, since the solution that worked for me wasn't listed anywhere. The order of the compiler flags matters. I was including multiple header files from many locations (-I/usr/local/include -Iutil -I. And I was compiling with all warnings on (-Wall).

The correct recipe for me was:

gcc -I/usr/local/include -Iutil -I -Wall -g -c main.c -o main.o

Notice:

  • include flags are at the beginning
  • -Wall is after include flags and before -g
  • -g is at the end

Any other ordering of the flags would cause no debug symbols to be generated.

I'm using gcc version 11.3.0 on Ubuntu 22.04 on WSL2.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜