我编译了一个C ++程序,现在想用gdb调试它。 gcc的版本为gcc (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
,而gdb是GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
,因此this在我的案例中似乎不是问题。
启动像$ gdb --args ./my_program /path/to/a/file
这样的gdb有效,但它会产生以下消息:
Reading symbols from ./my_program...(no debugging symbols found)...done.
我仍然可以使用run
运行程序,但任何需要调试符号的内容都会失败,例如在行上设置断点,或使用i line
或i locals
。
正如this answer中所建议的那样,我运行了$ objdump --debugging ./my_program
,输出填充了几千行,因此我确信调试符号确实可用。
还有this question,但它似乎与共享库更相关。在gdb中运行info sharedlibrary
表示那些在我的情况下没有调试信息,但我认为我不需要担心这一点。
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7ddab00 0x00007ffff7df5660 Yes /lib64/ld-linux-x86-64.so.2
0x00007ffff74f1250 0x00007ffff74f1dc3 Yes (*) /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0
0x00007ffff72e0a80 0x00007ffff72eb5e0 Yes (*) /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.54.0
0x00007ffff70a5810 0x00007ffff70b6a43 Yes (*) /usr/lib/x86_64-linux-gnu/libexif.so.12
[...]
(*): Shared library is missing debugging information.
正如评论中所建议的,我还检查了剥离:
$ file ./my_program
./shore_evaluate: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux),
dynamically linked (uses shared libs), for GNU/Linux 2.6.24,
BuildID[sha1]=aa85fb21d388828eced5bd0be4202a50bbba1b90, not stripped
如何让GDB找到调试符号?