Debian/Ubuntu 的调试信息文件约定?
Debug information file conventions for Debian/Ubuntu?
根据 lothar 在 How to generate gcc debug symbol outside the build target 的回答,我可以创建一个由两部分组成的可执行文件 - 剥离的可执行文件和调试信息文件。
创建剥离的可执行文件和调试信息文件后,我正常安装可执行文件(make install
)。但是我不确定如何处理 Debian/Ubuntu.
的调试信息文件
关于使用 GDB 或 LLDB 调试可执行文件(如果需要调试),我有两个问题:
Debian/Ubuntu 上的调试信息文件的名称是什么?是否有可遵循的约定以便调试器自动将它们与可执行文件相关联?
我应该将调试信息文件放在 Debian/Ubuntu 的什么地方?调试器在调试可执行文件时找到它们的位置是什么?
这是一个针对不同平台的相关问题:了解 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
.
根据 lothar 在 How to generate gcc debug symbol outside the build target 的回答,我可以创建一个由两部分组成的可执行文件 - 剥离的可执行文件和调试信息文件。
创建剥离的可执行文件和调试信息文件后,我正常安装可执行文件(make install
)。但是我不确定如何处理 Debian/Ubuntu.
关于使用 GDB 或 LLDB 调试可执行文件(如果需要调试),我有两个问题:
Debian/Ubuntu 上的调试信息文件的名称是什么?是否有可遵循的约定以便调试器自动将它们与可执行文件相关联?
我应该将调试信息文件放在 Debian/Ubuntu 的什么地方?调试器在调试可执行文件时找到它们的位置是什么?
这是一个针对不同平台的相关问题:
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
.