我目前正在写一个小型图书馆,我想检查它是否有泄漏(除此之外);但是,由于某种原因,gdb
未加载库符号。我已经在这里阅读了许多其他帖子(以及互联网上的其他各个地方),但是,我似乎无法找到解决方案。这是正在发生的事情:
我正在使用以下标志编译共享库(这些标志包含在最终的共享库以及所有目标文件中):
CFLAGS=-Wall -O0 -g -fPIC
同样,我正在编译二进制文件memtest
(库的客户端应用程序)来检查内存泄漏等等这些标志
CFLAGS=-Wall -O0 -g
现在,我将一个NULL指针插入到库中以测试我是否可以跟踪它并“调试”指针(即它使它崩溃)。所以我尝试通过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
链接/加载它)
EDIT2 我的GDB版本似乎已经过时了。现在,我已经从CVS服务器更新到最新版本(我还尝试了最新版本version 7.2
),它可以“加载”符号。我的info sharedlibrary
现在读到了这个:
0x00e418b0 0x00e4be74 Yes /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
但是,我仍然无法单步执行任何功能(在共享库中) - 任何人都有任何想法?
EDIT3 我还尝试逐步链接到静态库(libMyLIB.a),但它仍然无效。我的操作系统是CentOS 5.6;有谁知道这个系统的任何问题?另外,只是另一个确认我的符号被加载(由于某种原因它不能单步执行任何共享的lib函数)
(gdb) sharedlibrary MyLIB
Symbols already loaded for /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
答案 0 :(得分:3)
我发现这个原因不起作用:我正在调用一个旧的函数调用来初始化我的测试可执行文件中的指针。由于永远不会创建对象,因此我无法进入库中。一旦我更新了函数调用,一切运行良好。
也就是说,如果在所有符号都被加载的情况下遇到类似问题,请务必检查所有指针是否已正确初始化,即使它们具有正确的类型。