linux - Debian/Ubuntu 的调试信息文件约定?

标签 linux debugging gdb debian lldb

根据 lothar 在 How to generate gcc debug symbol outside the build target 的回答,我可以创建一个由两部分组成的可执行文件 - 剥离的可执行文件和调试信息文件。

创建剥离的可执行文件和调试信息文件后,我正常安装可执行文件(使用 make install)。但是我不确定如何处理 Debian/Ubuntu 的调试信息文件。

我有两个与使用 GDB 或 LLDB 调试可执行文件相关的问题(如果需要调试):

  • Debian/Ubuntu 上的调试信息文件的名称是什么?是否有可遵循的约定以便调试器自动将它们与可执行文件相关联?

  • 在 Debian/Ubuntu 上,我应该把调试信息文件放在哪里?调试器在调试可执行文件时找到它们的位置是什么?

这是针对不同平台的相关问题:Debug information file conventions for Red Hat/Fedora?了解 OS X 的相同内容也会很有帮助,因为我有时会使用它。

最佳答案

Fedora 和 Ubuntu 都遵循 Debugging Information in Separate Files 中描述的约定。 .

Gdb 首先检索存在于可执行文件的 .gnu_debuglink 部分中的文件名。 .gnu_debuglink 不包含任何目录名称。 Gdb 然后查找名为(如果我可以使用 shell 语法)$(dirname $executable)/$debuglink 的文件,然后是 /usr/lib/debug/$(dirname $executable)/$debuglink,用于调试信息。 (它实际上在几个替代位置查找;上面链接的文档有更多信息。)

发行版提供的可执行文件的调试信息可以在例如以下位置找到 /usr/lib/debug/usr/sbin/apache2 在 Ubuntu 上或 /usr/lib/debug/usr/sbin/httpd.debug 在 Fedora 上。 (Fedora 添加了一个 .debug 扩展名,如果您愿意,可以轻松地将带有调试信息的文件放在与可执行文件相同的目录中。)

目录 /usr/lib/debug 在构建时被编译到 gdb 中,但是 gdb 用户可以使用 set debug-file-directory dirpath1:dirpath2:.. . 命令。

如果您也有兴趣将源代码提供给 gdb:

Gdb 在编译目录(它从调试信息的 DW_AT_comp_dir 属性中检索)或当前工作目录中查找源代码。用户可以使用 Specifying Source Directories 中描述的各种 gdb 命令对此进行调整。

Fedora 的*-debuginfo 包包括调试信息和源代码。源码安装在/usr/src/debug下,/usr/lib/debug下的调试信息包含一个DW_AT_comp_dir 带有目录路径名的属性,例如 /usr/src/debug/httpd-2.4.10。如果可执行文件是从多个编译单元构建的,则可以有多个 DW_AT_comp_dir 属性。

根据我的经验,Ubuntu 的 *-dbg 包不包含源代码,但用户可以使用命令 apt-get source .. .。调试信息的 DW_AT_comp_dir 属性类似于 /build/buildd/apache2-2.4.7

关于linux - Debian/Ubuntu 的调试信息文件约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28787534/

相关文章:

linux - 为什么我的基于 Linux prio 的 tc 没有改善网络延迟?

c++ - 程序接收信号 SIGSEGV,段错误

iPhone应用程序崩溃: Assertion failed function evict_glyph_entry_from_strike,文件Fonts/CGFontCache.c

assembly - 尝试在汇编程序中打印变量时 GDB 显示错误消息

qt - 调试很慢

linux - 使用 make 编译期间未找到头文件 (Linux)

linux - 显示包含模式 'Pap' 但不包含模式 'Aig' 的文件行

python - 使函数命名空间保持事件状态以便在 IPython 中进行调试

iphone - 调试构建工作得很好,临时构建很难崩溃

c - 汇编 - 如何找到一个函数为自己分配了多少堆栈空间