无法调试共享库-符号未正确加载

13

我正在编写一个小库,希望检查是否存在内存泄漏等问题;然而,出于某种原因,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

当代码构建于不同于运行环境的系统上时,我也会遇到这个问题。有可能是这个原因吗? - wallyk
不是的。我在这台特定的机器上从源代码构建了所有二进制文件。 - RageD
不知道这是否有帮助,但是这个旧的错误报告表明,共享库符号问题是由于不正确的符号链接引起的:http://bugs.gentoo.org/show_bug.cgi?id=273279。可能是一个线索? - Michael Burr
你使用的 GDB 版本是什么? - Michael Burr
GNU gdb(GDB)Red Hat Enterprise Linux(7.0.1-32.el5_6.2)- 我现在正在查看我的符号链接。我只是使用 ln -s file.so.0.0.1 link.so.0ln -s file.so.0 link.so - 你知道我是否还需要做更多的事情吗? - RageD
显示剩余4条评论
1个回答

3
我发现这个问题的原因是:我在我的测试可执行文件中调用了一个旧的函数来初始化指针。由于对象从未被创建,我无法进入库。一旦我更新了函数调用,一切都正常了。
话虽如此,如果任何人遇到类似的问题,即使所有符号都已加载,请确保检查所有指针是否正确初始化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接