第 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 ...
    Copy to Clipboard Toggle word wrap

    这个选项指示 GCC 在输出二进制文件中包含调试信息。有关 the -g 选项和其他调试选项的更多信息,请参阅 GCC 手册页。

  • 要在调试信息中包含宏定义,请使用 the -g3 选项而不是 -g

    $ gcc ... -g3 ...
    Copy to Clipboard Toggle word wrap
  • 要测试 debug 选项不会影响可执行代码,请使用 the -fcompare-debug GCC 选项。这个选项:

    • 使用调试信息编译代码两次 - 次,一次使用调试信息,没有
    • 比较生成的二进制文件
    • 如果两个二进制文件都相同,则通过测试

      此测试可防止调试选项在您的代码中引入隐藏的错误。请注意,use -fcompare-debug 会显著增加编译时间。如需了解更多详细信息,请参阅 GCC 手册页。

      重要

      编译器和链接器优化可能会导致调试困难:

      为获得更好的调试体验,请考虑使用 the -Og 选项。但是,更改的优化级别可能会改变可执行的代码行为,并可能会隐藏错误。

3.1.3. debuginfo 和 debugsource 软件包

debuginfodebugsource 软件包包含程序和库的调试信息和调试源代码。对于安装在 Red Hat Enterprise Linux 存储库的软件包中的应用程序和库,您可以从其它渠道获得单独的debuginfodebugsource 软件包。

调试信息软件包类型
debuginfo 软件包debuginfo 软件包提供为二进制代码功能提供人类可读的名称所需的调试信息。这些软件包包含 .debug 文件,其中包含 DWARF 调试信息。这些文件被安装到 /usr/lib/debug 目录中。

Debugsource 软件包debugsource 软件包包含用于编译二进制代码的源文件。分别安装了 debuginfodebugsource 软件包后,GDB 或 LLDB 等调试程序可以将二进制代码的执行与源代码相关联。源代码文件被安装到 /usr/src/debug 目录中。

需要调试信息来调试代码。对于从软件包安装的代码,GNU Debugger(GDB)自动识别缺少的调试信息,解析软件包名称并提供有关如何获取软件包的具体建议。

先决条件

流程

  1. 启动连接到要调试的应用程序或库的 GDB。GDB 自动识别缺少的调试信息,并建议要运行的命令。

    $ 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 Toggle word wrap
  2. 退出 GDB:输入 q 并使用 Enter 进行确认。

    (gdb) q
    Copy to Clipboard Toggle word wrap
  3. 运行 GDB 建议的命令来安装所需的 debuginfo 软件包:

    # dnf debuginfo-install coreutils-9.5-6.el10.x86_64
    Copy to Clipboard Toggle word wrap

    dnf 软件包管理工具提供更改摘要、要求确认,并在确认后,下载并安装所有必需的文件。

  4. 如果 GDB 无法建议 debuginfo 软件包,请按照以下所述步骤操作

您可以通过查找可执行文件来确定您需要安装哪些 debuginfo 软件包,然后查找安装它的软件包。

注意

红帽建议您 使用 GDB 来确定安装的软件包。只有在 GDB 无法建议安装软件包时,才使用这个手动过程。

先决条件

流程

  1. 查找应用程序或库的可执行文件。

    1. 使用 which 查找应用程序文件。

      $ which less
      /usr/bin/less
      Copy to Clipboard Toggle word wrap
    2. 使用 locate 命令查找库文件。

      $ locate libz | grep so
      /usr/lib64/libz.so.1
      /usr/lib64/libz.so.1.2.11
      Copy to Clipboard Toggle word wrap

      如果调试的最初原因包含错误消息,请选择库的文件名中与错误消息中提及的具有相同的额外数字的结果。若有疑问,请使用文件名不包含其他数字的结果来尝试遵循该流程的其余部分。

      注意

      locate 命令由 mlocate 软件包提供。要安装并启用它:

      # dnf install mlocate
      # updatedb
      Copy to Clipboard Toggle word wrap
  2. 搜索提供该文件的软件包的名称和版本:

    $ rpm -qf /usr/lib64/libz.so.1.3.1.zlib-ng
    zlib-ng-compat-2.2.3-1.el10.x86_64
    Copy to Clipboard Toggle word wrap

    输出以 name:epoch-version.release.architecture 格式提供已安装软件包的详细信息。

    重要

    如果此步骤没有生成任何结果,则无法确定哪一个软件包提供了二进制文件。有几个可能的情况:

    • 文件是从 current 配置中包管理工具不知道的包安装的。
    • 文件从本地下载和手动安装的包中安装的。在这种情况下,自动确定合适的 debuginfo 软件包是不可能的。
    • 您的软件包管理工具配置错误。
    • 文件不是从任何软件包安装的。在这种情况下,没有对应的 debuginfo 软件包存在。

    因为后续步骤依赖于此,所以您必须解决这种情况或中止这个过程。描述确切的故障排除步骤不在本流程范围内。

  3. 使用 dnf debuginfo-install 工具安装 debuginfo 软件包。在命令中,使用软件包名称以及您在上一步中确定的其他详情:

    # dnf debuginfo-install zlib-ng-compat-2.2.3-1.el10.x86_64
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat