【发布时间】:2011-09-16 21:59:54
【问题描述】:
我目前正在编写一个小型库,我想检查它是否有泄漏(除其他外);但是,由于某种原因,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 我还尝试逐步链接到 static 库 (libMyLIB.a),但它仍然无法正常工作。我的操作系统是 CentOS 5.6;有人知道这个系统有什么问题吗?此外,只是另一个确认我的符号正在加载(由于某种原因它无法单步执行任何共享库函数)
(gdb) sharedlibrary MyLIB
Symbols already loaded for /home/raged/MyLIB/memtest/../lib/libMyLIB.so.0
【问题讨论】:
-
当代码构建在与其运行位置不同的系统上时,我会遇到这种情况。有没有可能是问题所在?
-
不。我在这台特定的机器上从源代码构建了所有二进制文件。
-
不知道这是否有帮助,但这个旧的错误报告表明共享库符号问题是由于不正确的符号链接:bugs.gentoo.org/show_bug.cgi?id=273279 可能是一个线索?
-
你使用的是什么版本的 GDB?
-
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-32.el5_6.2)- 我现在正在查看我的符号链接。我只是在使用ln -s file.so.0.0.1 link.so.0和ln -s file.so.0 link.so- 你知道我还需要做什么吗?
标签: c++ debugging gdb shared-libraries debug-symbols