【问题标题】:Cannot Debug Shared Library - Symbols Not Loading Properly无法调试共享库 - 符号未正确加载
【发布时间】: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.0ln -s file.so.0 link.so - 你知道我还需要做什么吗?

标签: c++ debugging gdb shared-libraries debug-symbols


【解决方案1】:

我找到了不起作用的原因:我正在调用旧函数调用来初始化我的测试可执行文件中的指针。由于从未创建过对象,因此我永远无法进入库。一旦我更新了函数调用,一切都运行良好。

也就是说,如果有人在所有符号似乎都已加载时遇到类似问题,请务必检查所有指针是否已正确初始化,即使它们具有正确的类型。

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2016-03-25
    • 2015-07-28
    • 2015-01-27
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多