我正在编写一个小库,希望检查是否存在内存泄漏等问题;然而,出于某种原因,gdb
没有加载库的符号。我已经阅读了这里(以及互联网上其他各种地方)的许多帖子,但是似乎找不到解决方案。以下是发生的情况:
我使用以下标志编译共享库(这些标志包含在最终的共享库和所有目标文件中):
CFLAGS=-Wall -O0 -g -fPIC
同样地,我正在使用这些标志编译二进制文件 memtest
(该库的客户端应用程序),以检查内存泄漏等问题
CFLAGS=-Wall -O0 -g
现在,我插入了一个空指针到库文件中进行测试以检查是否能够跟踪和“调试”指针(即它正在导致崩溃)。所以我尝试通过gdb运行它,但是不行。 info sharedlibrary
命令的输出对可执行文件和内核来说都是相同的。
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
... Some libraries I am not worried about debugging...
0x00d37340 0x00d423a4 Yes (*) /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0 <--- My lib
.... and some more....
(*): Shared library is missing debugging information.
正如您所看到的,它没有加载调试信息。我不确定为什么会这样。我使用-g
标志构建和链接了所有内容,甚至尝试了-ggdb
和-g3
,但似乎什么都不能正常工作。当我加载核心转储时,我看到的是:
...some libs...
Reading symbols from /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0...done.
Loaded symbols for /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
Reading symbols from /usr/lib/libstdc++.so.6...(no debugging symbols found)...done.
...some more libs...
注意到我的库没有出现(no debugging symbols found)
错误 - 有人知道为什么吗?正如我之前所说,我无法通过运行程序gdb ./memtest
或调试核心文件来进行调试。
感谢您的帮助。
编辑 另外需要注意的是(如果您没有通过路径意识到),这个库是一个本地共享库(即我正在使用-Wl,-rpath
来链接/加载它)
编辑2 看起来我的GDB版本过时了。现在,我已经从CVS服务器更新到了最新版本(我也尝试了最新版本7.2
),现在它可以“加载”符号。我的info sharedlibrary
现在显示为:
0x00e418b0 0x00e4be74 Yes /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
然而,我仍然无法逐步执行任何函数(在共享库中)- 有人有任何想法吗?
编辑3 我还尝试了链接到一个静态库(libMyLIB.a),但它仍然不起作用。我的操作系统是CentOS 5.6; 有人知道这个系统是否存在任何问题吗?另外,只是再次确认我的符号正在被加载(由于某些原因无法逐步执行任何共享库函数)。
(gdb) sharedlibrary MyLIB
Symbols already loaded for /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
ln -s file.so.0.0.1 link.so.0
和ln -s file.so.0 link.so
- 你知道我是否还需要做更多的事情吗? - RageD