2

在调试我的应用程序时,如果我闯入 GDB 并尝试打印 errno,即使是从检查 errno 的函数内部,我也会从 GDB 收到以下错误:

(gdb) print errno
Cannot find shared library `/usr/lib/debug/lib/libc-2.11.1.so' in dynamic linker's load module list

我尝试过的事情:

  1. 检查文件是否存在,它确实存在并且大约 7.3MB。
  2. 将 /usr/lib/debug/lib/ 添加到我的 LD_LIBRARY_PATH 的前面。没有效果。
  3. 设置 LD_PRELOAD=/usr/lib/debug/lib/libc-2.11.1.so 会导致我的应用程序在启动时出现段错误。
  4. 如果我在二进制文件上运行 ldd,它说它正在使用“/lib/libc.so.6”,而 aptitude(我正在运行 Ubuntu)告诉我 libc6-dbg安装。
  5. 检查我没有在 .gdbinit 中设置自定义库路径,我没有。

该应用程序似乎运行良好,所以我无法想象 libc 本身被搞砸了。有任何想法吗?

4

1 回答 1

13

该文件/usr/lib/debug/lib/libc-2.11.1.so不包含 glibc 的调试版本包含libc 的调试部分,但没有实际的可执行代码。将其放入LD_PRELOADorLD_LIBRARY_PATH错误的做法。不要那样做。

您可以在此处阅读有关单独调试文件的信息。

(gdb) print errno
在动态链接器的加载模块列表中找不到共享库`/usr/lib/debug/lib/libc-2.11.1.so'

这是 GDB 中的一个 buglet。

您应该知道 GDB 会查找变量errno,但您的应用程序不使用任何此类变量。相反,errno是一个#defined 宏,它扩展为*(__errno_location()),而 GDB 不知道这一点。

试试这个:

(gdb) p __errno_location()
$1 = (int *) 0x7ffff78396a8

(gdb) x/x $1
0x7ffff78396a8: 0x00000000
于 2012-12-04T05:23:16.397 回答