即使加载了调试符号,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.deb
、libmy_lib1-dev-1.deb
和 libmy_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
提供了更多帮助。
我有一个用
创建的 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.deb
、libmy_lib1-dev-1.deb
和 libmy_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
提供了更多帮助。