即使加载了调试符号,GDB 进入共享库也会显示 "no such file"

GDB stepping into shared library shows "no such file" even though debug symbols are loaded

我有一个用

创建的 C 库
cc -fPIC -g -O3   -c -o obj/my_lib.o my_lib.c
g++ -shared -Wl,-soname,libmy_lib.so.1  obj/my_lib.o -o libmy_lib.so.1.8.0 

这个库被打包成 dpkg-buildpackage 生成 libmy_lib1-1.deblibmy_lib1-dev-1.deblibmy_lib1-dbgsym-1.ddeb 的 debian 软件包。安装所有这些包后,我就可以 compile/link 一个调用库的简单测试程序。这行得通。 运行 测试程序有效。

但是,当我运行 GDB 在测试程序(在同一台计算机上)时,我看到

gdb$ break main
Breakpoint 1 at 0x87e: file test.c, line 10.
gdb$ info sharedlibrary
No shared libraries loaded at this time.
gdb$ r
Starting program: /tmp/a.out

Breakpoint 1, main () at test.c:10
10        my_library_func();
gdb$ info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7dd5f10  0x00007ffff7df4b20  Yes         /lib64/ld-linux-x86-64.so.2
0x00007ffff7bac9a0  0x00007ffff7bad438  Yes         /usr/lib/x86_64-linux-gnu/libmy_lib.so.1
0x00007ffff74532d0  0x00007ffff75cbc3c  Yes         /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff709fa80  0x00007ffff715e2f5  Yes         /lib/x86_64-linux-gnu/libm.so.6
0x00007ffff6e7eac0  0x00007ffff6e8f36d  Yes         /lib/x86_64-linux-gnu/libgcc_s.so.1
(*): Shared library is missing debugging information.
gdb$ s
my_library_func () at my_lib.c:299
299     my_lib.c: No such file or directory.

如您所见,GDB 知道库的调试符号。但是,它不知道库的源文件。我应该如何 运行ning GDB 才能解析 C 源代码?

GDB 搜索多个默认目录路径来定位指定的源文件。您可以使用 directory 命令添加路径:https://sourceware.org/gdb/current/onlinedocs/gdb/Source-Path.html

您还需要告诉 gdb 源文件在哪里。这意味着您还需要源文件,而不仅仅是调试符号。

重要的是您下载的源是用于编译库的实际源,因为调试信息仅包含文件名和行号。如果您给 gdb 一个行号不对应的文件(例如,不同的版本),gdb 打印的源行将非常混乱。它无法知道他们错了。您应该能够使用与库 debs 具有相同版本号的 src deb。

获得源文件后,使用

告诉 gdb 在哪里寻找它们
directory /path/to/source/files

您可以指定多个路径。在 gdb 中读取 help directory

由于您需要经常这样做,因此将该行放入 gdbinit 文件中。您可能希望在当前目录中使用 .gdbinit,但在您的主目录中也可能使用 .gdbinit。 Gdb 两者都用。

如果您使用的库的源代码分布在子目录树中,您可能会发现设置替换路径很有用:

set substitute-path /your/file/path /original/file/path

同样,help set substitute-path 提供了更多帮助。