我正在使用
set verbose on
运行 gdb,并且我正在尝试理解我收到的消息之一:
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...(no debugging symbols found)...done.
什么是
system-supplied DSO
?经过一番搜索,我认为 DSO
可能代表“动态共享对象”。但我仍然不明白 gdb 在这里做什么以及如何解决找不到调试符号的问题(或者如果它甚至很重要)。
我正在调试的程序正在使用 llvm-gcc 进行编译,并应用了 LLVM pass。我认为这会影响 gdb 的行为,但我不太确定如何影响。
所以本质上我的问题是 gdb 打印的消息意味着什么,它是否可能导致问题,如果是的话,有什么关于如何帮助 gdb 找到调试符号的建议。
在此上下文中,系统提供的 DSO 表示由 Linux 内核直接提供的共享库,例如 VDSO。 Debuginfo 确实可供他们使用,但与内核而不是用户空间一起打包。如果您的发行版支持,请使用 debuginfod 自动获取它们。
根据this文档,DSO 是:
动态共享对象 (DSO) 是一个对象文件,旨在 由多个应用程序同时使用或共享(a.out 文件) 当他们执行时。
我相信系统提供的 DSO 只是操作系统提供的 DLL,并由主可执行文件加载。由于这是一个外部库,因此您没有此类对象的调试符号,除非您单独下载它们。通常,发布二进制文件会删除调试符号,但它们可以具有指向单独文件的链接。典型的 Linux 发行版提供了一个包含此类二进制文件的调试符号的包(例如基于 RedHat 的发行版的 xxx-debuginfo-xxx.rpm)。