第 3 章 调试应用程序
调试应用程序是一个非常广泛的话题。本节为开发人员提供了在各种情况下进行调试的最通用的技术。
3.1. 启用带有调试信息的调试 复制链接链接已复制到粘贴板!
要调试应用和库,需要调试信息。以下章节描述了如何获取此信息。
3.1.1. 调试信息 复制链接链接已复制到粘贴板!
在调试任何可执行代码时,两种类型的信息允许程序员通过工具和扩展来理解二进制代码:
- 源代码文本
- 源代码文本如何与二进制代码相关的描述
此类信息称为调试信息。
Red Hat Enterprise Linux 对可执行二进制文件、共享库或 debuginfo
文件使用 ELF 格式。在这些 ELF 文件中,DWARF 格式用于保存调试信息。
要显示存储在 ELF 文件中的 DWARF 信息,请运行 readelf -w file
命令。
STABS 是一种较旧、功能较弱的格式,有时与 UNIX 一起使用。红帽不鼓励使用它。GCC 和 GDB 仅在尽最大努力的基础上提供 STABS 生产和消费。一些其他工具,如 Valgrind 和 elfutils
,不适用于 STABS。
3.1.2. 使用 GCC 启用 C 和 C++ 应用程序的调试 复制链接链接已复制到粘贴板!
编译器默认省略调试信息,以保持二进制文件小。要使用它启用 C 和 C++ 应用程序的调试,您必须明确指示编译器创建调试数据。
流程
要在编译并使用 GCC 编译和链接 C 或 C++ 应用程序时生成调试信息,请在编译命令中添加 the
-g
选项:gcc ... -g ...
$ gcc ... -g ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个选项指示 GCC 在输出二进制文件中包含调试信息。有关 the
-g
选项和其他调试选项的更多信息,请参阅 GCC 手册页。要在调试信息中包含宏定义,请使用 the
-g3
选项而不是-g
:gcc ... -g3 ...
$ gcc ... -g3 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要测试 debug 选项不会影响可执行代码,请使用 the
-fcompare-debug
GCC 选项。这个选项:- 使用调试信息编译代码两次 - 次,一次使用调试信息,没有
- 比较生成的二进制文件
如果两个二进制文件都相同,则通过测试
此测试可防止调试选项在您的代码中引入隐藏的错误。请注意,use
-fcompare-debug
会显著增加编译时间。如需了解更多详细信息,请参阅 GCC 手册页。重要编译器和链接器优化可能会导致调试困难:
为获得更好的调试体验,请考虑使用 the
-Og
选项。但是,更改的优化级别可能会改变可执行的代码行为,并可能会隐藏错误。
3.1.3. debuginfo 和 debugsource 软件包 复制链接链接已复制到粘贴板!
debuginfo
和 debugsource
软件包包含程序和库的调试信息和调试源代码。对于安装在 Red Hat Enterprise Linux 存储库的软件包中的应用程序和库,您可以从其它渠道获得单独的debuginfo
和 debugsource
软件包。
- 调试信息软件包类型
-
debuginfo 软件包
:debuginfo
软件包提供为二进制代码功能提供人类可读的名称所需的调试信息。这些软件包包含.debug
文件,其中包含 DWARF 调试信息。这些文件被安装到/usr/lib/debug
目录中。
Debugsource 软件包
: debugsource
软件包包含用于编译二进制代码的源文件。分别安装了 debuginfo
和 debugsource
软件包后,GDB 或 LLDB 等调试程序可以将二进制代码的执行与源代码相关联。源代码文件被安装到 /usr/src/debug
目录中。
3.1.4. 使用 GDB 获取应用程序或库的 debuginfo 软件包 复制链接链接已复制到粘贴板!
需要调试信息来调试代码。对于从软件包安装的代码,GNU Debugger(GDB)自动识别缺少的调试信息,解析软件包名称并提供有关如何获取软件包的具体建议。
先决条件
- 必须在系统上安装您要调试的应用程序或库。
-
GDB 和
debuginfo-install
工具必须安装在系统上。 -
必须在系统上配置并启用提供
debuginfo
和debugsource
软件包的存储库。详情请参阅 启用调试和源存储库。
流程
启动连接到要调试的应用程序或库的 GDB。GDB 自动识别缺少的调试信息,并建议要运行的命令。
gdb -q /bin/ls
$ gdb -q /bin/ls Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done. (no debugging symbols found)...done. Missing separate debuginfos, use: dnf debuginfo-install coreutils-9.5-6.el10.x86_64 (gdb)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 退出 GDB:输入 q 并使用 Enter 进行确认。
(gdb) q
(gdb) q
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行 GDB 建议的命令来安装所需的
debuginfo
软件包:dnf debuginfo-install coreutils-9.5-6.el10.x86_64
# dnf debuginfo-install coreutils-9.5-6.el10.x86_64
Copy to Clipboard Copied! Toggle word wrap Toggle overflow dnf
软件包管理工具提供更改摘要、要求确认,并在确认后,下载并安装所有必需的文件。如果 GDB 无法建议
debuginfo
软件包,请按照以下所述步骤操作
3.1.5. 手动为应用程序或库获取 debuginfo 软件包 复制链接链接已复制到粘贴板!
您可以通过查找可执行文件来确定您需要安装哪些 debuginfo
软件包,然后查找安装它的软件包。
红帽建议您 使用 GDB 来确定安装的软件包。只有在 GDB 无法建议安装软件包时,才使用这个手动过程。
先决条件
- 应用程序或库必须安装在系统上。
- 应用程序或库是从软件包安装的。
-
debuginfo-install
工具必须在系统上可用。 -
必须在系统中配置和启用提供
debuginfo
软件包的频道。
流程
查找应用程序或库的可执行文件。
使用
which
查找应用程序文件。which less
$ which less /usr/bin/less
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
locate
命令查找库文件。locate libz | grep so
$ locate libz | grep so /usr/lib64/libz.so.1 /usr/lib64/libz.so.1.2.11
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果调试的最初原因包含错误消息,请选择库的文件名中与错误消息中提及的具有相同的额外数字的结果。若有疑问,请使用文件名不包含其他数字的结果来尝试遵循该流程的其余部分。
注意locate
命令由mlocate
软件包提供。要安装并启用它:dnf install mlocate updatedb
# dnf install mlocate # updatedb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
搜索提供该文件的软件包的名称和版本:
rpm -qf /usr/lib64/libz.so.1.3.1.zlib-ng
$ rpm -qf /usr/lib64/libz.so.1.3.1.zlib-ng zlib-ng-compat-2.2.3-1.el10.x86_64
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出以 name:epoch-version.release.architecture 格式提供已安装软件包的详细信息。
重要如果此步骤没有生成任何结果,则无法确定哪一个软件包提供了二进制文件。有几个可能的情况:
- 文件是从 current 配置中包管理工具不知道的包安装的。
-
文件从本地下载和手动安装的包中安装的。在这种情况下,自动确定合适的
debuginfo
软件包是不可能的。 - 您的软件包管理工具配置错误。
-
文件不是从任何软件包安装的。在这种情况下,没有对应的
debuginfo
软件包存在。
因为后续步骤依赖于此,所以您必须解决这种情况或中止这个过程。描述确切的故障排除步骤不在本流程范围内。
使用
dnf debuginfo-install
工具安装debuginfo
软件包。在命令中,使用软件包名称以及您在上一步中确定的其他详情:dnf debuginfo-install zlib-ng-compat-2.2.3-1.el10.x86_64
# dnf debuginfo-install zlib-ng-compat-2.2.3-1.el10.x86_64
Copy to Clipboard Copied! Toggle word wrap Toggle overflow