C GDB走进共享库展示;“没有此类文件”;即使已加载调试符号

C GDB走进共享库展示;“没有此类文件”;即使已加载调试符号,c,debugging,gdb,shared-libraries,C,Debugging,Gdb,Shared Libraries,我有一个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 此库被打包成debian包,其中包含dpkg buildpackage生成的libmy_lib1-1.deb,libmy_lib1-dev-1.deb,以及libmy_lib1-dbgsym-1.ddeb。安装所有这些包之后,我就可以编译/链接一个简单的测

我有一个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
此库被打包成debian包,其中包含
dpkg buildpackage
生成的
libmy_lib1-1.deb
libmy_lib1-dev-1.deb
,以及
libmy_lib1-dbgsym-1.ddeb
。安装所有这些包之后,我就可以编译/链接一个简单的测试程序,调用库。这很有效。运行测试程序是可行的

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


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

GDB搜索许多默认目录路径来定位指定的源文件。您可以使用
目录
命令添加路径:

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

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

一旦你有了源文件,告诉gdb在哪里可以找到它们

directory /path/to/source/files
您可以指定多个路径。阅读gdb中的帮助目录

因为您需要经常这样做,所以请将该行放入一个文件中。您可能希望在当前目录中使用
.gdbinit
,但也可能在主目录中使用
.gdbinit
。Gdb同时使用这两种方法

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

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

同样,在
帮助设置替换路径

中提供了更多帮助。为什么我需要共享库的实际源文件,而不需要独立程序的源文件?我通常只是将调试符号与我想要调试的服务一起安装,它会完美地进入断点。我第一次用共享库测试它时,它说它找不到源文件,这对我来说是全新的?你能给我解释一下吗?@electronic:你也需要独立程序的实际源文件。调试信息仅包含源文件的路径。如果您移动、重命名或删除源文件,那么您将从gdb收到相同的错误消息。这应该很容易测试。我实际上搜索了
(gdb)信息源
列出的文件,但在文件系统中找不到它们,文件名为
find/-iname“*sourcefile.cpp*”
。但是,只需使用
dpkg
安装调试符号debian包,就可以调试一个服务(独立服务),而不会出现任何问题。另一个是一个JNI应用程序,它有一个C++共享库,在那里我安装了调试符号,并将它加载到GDB(如我用代码>(GDB)信息共享库< /代码>验证,它列出了我的调试符号作为加载的),但是当它遇到断点时失败了,断点表示
没有这样的文件或目录
@electronic:看起来你已经做了足够的研究,能够轻松地在一个新问题中构建一个新的。我敦促你这样做,因为没有细节很难回应,细节也不适合评论。好吧,我的错,谢谢你的建议,提供了一个最小的例子,因此我可以看到,如果gdb没有找到源文件,这实际上甚至不是一个问题,您仍然可以在断点期间点击并调查变量。。。因此,我的问题在其他地方。不确定为什么在断点期间无法打印“%s”,stringVariable
(获取
“无法转换为整数值”
错误),但至少我排除了这个原因。谢谢!
set substitute-path /your/file/path /original/file/path