用户指南
安装和使用 Red Hat Developer Toolset
摘要
部分 I. 简介 复制链接链接已复制到粘贴板!
第 1 章 Red Hat Developer Toolset 复制链接链接已复制到粘贴板!
1.1. 关于 Red Hat Developer Toolset 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 是 Red Hat Enterprise Linux 平台上的开发人员提供的红帽产品。它提供一组完整的开发和性能分析工具,可在多个版本的 Red Hat Enterprise Linux 上安装和使用。使用 Red Hat Developer Toolset 工具链构建的可执行文件也可以在多个 Red Hat Enterprise Linux 版本上部署并运行。有关详细兼容性信息,请参阅 第 1.3 节 “兼容性”。
在这些平台上安装时,Red Hat Developer Toolset 不会替换 Red Hat Enterprise Linux 7 提供的默认系统工具。相反,一组并行的开发人员工具提供了那些工具的较新版本,供开发人员使用。例如,默认的编译器和调试器保留基础 Red Hat Enterprise Linux 系统提供的编译器和调试器。
Red Hat Developer Toolset 9.1 中的新功能
从 Red Hat Developer Toolset 4.1 开始,Red Hat Developer Toolset 内容也以 ISO 格式和其它 Red Hat Software Collections 内容一起提供,特别是 Server 和 Workstation。https://access.redhat.com/downloads https://access.redhat.com/downloads请注意,需要 Optional 频道的软件包(在 第 1.5.3 节 “安装可选软件包” 中讨论)无法从 ISO 镜像安装。
| Name | 版本 | 描述 |
|---|---|---|
| GCC | 9.3.1 | 可移植编译器套件,支持 C、C++ 和 Fortran。 |
| binutils | 2.32 | 用于检查和操作对象文件和二进制文件的二进制工具集合。 |
| elfutils | 0.176 | 用于检查和操作 ELF 文件的二进制工具和其它工具的集合。 |
| dwz | 0.12 | 可优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具,以获得大小。 |
| GDB | 8.3 | 用于 C、C++ 和 Fortran 编写的程序的命令行调试器。 |
| ltrace | 0.7.91 | 一个显示调用程序创建的动态库的调试工具。它还可以监控程序执行的系统调用。 |
| strace | 5.1 | 一个监控程序使用的系统调用以及它收到的信号的调试工具。 |
| memstomp | 0.1.5 | 调试工具来识别对带有重叠内存区域的库函数的调用,这些区域不受各种标准所允许的。 |
| SystemTap | 4.1 | 一个追踪和探测工具,来监控整个系统的活动,而无需检测、重新编译、安装和重启。 |
| Valgrind | 3.15.0 (pre-release) | 一个评测应用程序的工具框架和一些工具,来检测内存错误、识别内存管理问题,并报告系统调用中任何不合适的参数。 |
| OProfile | 1.3.0 | 一个系统范围的配置集,它使用处理器上的性能监控硬件来检索系统上内核和可执行文件的信息。 |
| Dyninst | 10.1.0 | 在执行期间用于检测和使用用户空间可执行文件的库。 |
| make | 4.2.1 | 一个依赖项跟踪构建自动化工具。 |
| annobin | 8.79 | 构建安全检查工具。 |
Red Hat Developer Toolset 与 "技术预览" 在 Red Hat Enterprise Linux 中提供的两个重要方面提供了技术预览版本:
- Red Hat Developer Toolset 可以在 Red Hat Enterprise Linux 的多个主版本和次版本中使用,如 第 1.3 节 “兼容性” 所述。
- 与早期 Red Hat Enterprise Linux 提供的技术预览编译器和其他工具不同,Red Hat Developer Toolset 在 Red Hat Enterprise Linux 订阅级别协议下被完全支持,并适用于生产环境。
从每个主发行版本发布后两年,对 Red Hat Developer Toolset 订阅者发布重要的程序错误修复和安全勘误与 Red Hat Enterprise Linux 类似。每年发布了一个新的 Red Hat Developer Toolset 主版本,为现有组件提供重要的更新,并添加主要的新组件。在每个新的主版本发布后,会发布一个次版本(6 个月),它包括了较小的程序错误修复、安全勘误和新的次版本。
另外,Red Hat Enterprise Linux 应用程序兼容性规格 也适用于 Red Hat Developer Toolset (对于使用较新的 C++11 语言功能的一些限制,包括在 第 2.2.4 节 “C++ 兼容性”中)。
Red Hat Developer Toolset 提供的应用程序和库不会替换 Red Hat Enterprise Linux 系统版本,也不首选使用它们。使用名为 Software Collections 的框架,将一组额外的开发人员工具安装到 /opt/ 目录中,用户可使用 scl 实用程序根据需要明确启用。
1.2. 主要功能 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 包括以下更改:
- 带有许多新功能和程序错误修复的 GNU Compiler Collection (GCC)的 Red Hat Developer Toolset 版本已升级至版本 9.3.1。
- Red Hat Developer Toolset 版本的 GNU Debugger (GDB)已升级到 8.3 版本,带有许多新功能和程序错误修复。
有关本发行版本中引入的更改和功能的完整列表,请参阅 附录 B, 版本 9.1 的变化。
1.3. 兼容性 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 可用于多个架构的 Red Hat Enterprise Linux 7。
有关 ABI 兼容性信息,请参阅 第 2.2.4 节 “C++ 兼容性”。
| Runs on Red Hat Enterprise Linux 7.5 | Runs on Red Hat Enterprise Linux 7.6 | Runs on Red Hat Enterprise Linux 7.7 | |
|---|---|---|---|
| 使用 Red Hat Enterprise Linux 7.5 构建 | 支持 | 支持 | 支持 |
| 使用 Red Hat Enterprise Linux 7.6 构建 | 不支持 | 支持 | 支持 |
| 使用 Red Hat Enterprise Linux 7.7 构建 | 不支持 | 不支持 | 支持 |
架构支持
Red Hat Developer Toolset 在以下构架中提供:
- 64 位 Intel 和 AMD 架构
- 64 位 ARM 架构
- IBM POWER 架构(big-endian)
- IBM POWER 架构的 little-endian 变体
- IBM Z 架构
1.4. 访问 Red Hat Developer Toolset 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 是作为 Red Hat Software Collections 的一部分分发的产品。
这个内容集可供在 https://access.redhat.com/solutions/472793 中列出的 Red Hat Enterprise Linux 7 订阅用户使用。
使用红帽订阅管理启用 Red Hat Developer Toolset。有关如何使用此订阅管理服务注册您的系统的详情,请查看 Red Hat Subscription Management 指南。
1.4.1. 使用 Red Hat Software Collections 复制链接链接已复制到粘贴板!
完成以下步骤,附加一个可访问 Red Hat Software Collections 仓库的订阅(包括 Red Hat Developer Toolset),然后启用该存储库:
确定提供 Red Hat Software Collections (因此 Red Hat Developer Toolset)的订阅池 ID。要做到这一点,显示可用于您的系统的所有订阅列表:
subscription-manager list --available
# subscription-manager list --availableCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于每个可用的订阅,这个命令会显示其名称、唯一标识符、到期日期和其他与您的订阅相关的详情。池 ID 列在以
池 ID开头的行上。有关提供对 Red Hat Developer Toolset 访问的订阅的完整列表,请参阅 https://access.redhat.com/solutions/472793。
为您的系统附加适当的订阅:
subscription-manager attach --pool=pool_id
# subscription-manager attach --pool=pool_idCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您在上一步中确定的池 ID 替换 pool_id。要验证您的系统当前已附加的订阅列表,请随时:
subscription-manager list --consumed
# subscription-manager list --consumedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确定 Red Hat Software Collections 存储库的确切名称。检索存储库元数据,并显示可用的 Yum 存储库列表:
subscription-manager repos --list
# subscription-manager repos --listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 软件仓库名称取决于您正在使用的 Red Hat Enterprise Linux 的特定版本,并采用以下格式:
rhel-variant-rhscl-version-rpms rhel-variant-rhscl-version-debug-rpms rhel-variant-rhscl-version-source-rpms
rhel-variant-rhscl-version-rpms rhel-variant-rhscl-version-debug-rpms rhel-variant-rhscl-version-source-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此外,某些软件包(如 devtoolset-9-gcc-plugin-devel )依赖于 Optional 频道中提供的软件包。这些软件包的存储库名称使用以下格式:
rhel-version-variant-optional-rpms rhel-version-variant-optional-debug-rpms rhel-version-variant-optional-source-rpms
rhel-version-variant-optional-rpms rhel-version-variant-optional-debug-rpms rhel-version-variant-optional-source-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于常规存储库和可选存储库,请使用 Red Hat Enterprise Linux 系统变体(
服务器或工作站)替换 variant,并使用 Red Hat Enterprise Linux 系统 版本 (7)替换。启用步骤 no. 3 中的存储库:
subscription-manager repos --enable repository
# subscription-manager repos --enable repositoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用要启用的存储库的名称替换 repository。
当订阅附加到系统后,您可以安装 Red Hat Developer Toolset,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。有关如何使用红帽订阅管理注册您的系统并将其与订阅相关联的更多信息,请参阅 Red Hat Subscription Management 指南。
1.5. 安装 Red Hat Developer Toolset 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 作为 RPM 软件包的集合分发,可以使用 Red Hat Enterprise Linux 中包含的标准软件包管理工具来安装、更新、卸载和检查。请注意,需要一个有效的订阅,以便在您的系统上安装 Red Hat Developer Toolset,以提供对 Red Hat Software Collections 内容集的访问。有关如何将您的系统与适当的订阅关联并可以访问 Red Hat Developer Toolset 的详情,请参考 第 1.4 节 “访问 Red Hat Developer Toolset”。
在安装 Red Hat Developer Toolset 前,请安装所有可用的 Red Hat Enterprise Linux 更新。
1.5.1. 安装所有可用组件 复制链接链接已复制到粘贴板!
要安装 Red Hat Developer Toolset 中包含的所有组件,请安装 devtoolset-9 软件包:
yum install devtoolset-9
# yum install devtoolset-9
这会安装所有开发、调试和性能监控工具,以及系统的其他依赖软件包。另外,您可以选择只安装所选软件包组,如 第 1.5.2 节 “安装单个软件包组” 所述。
请注意,自 Red Hat Developer Toolset 3.0 开始,scl-utils 软件包不是 Red Hat Developer Toolset 的一部分,这是与 Red Hat Developer Toolset 软件集合一起安装的 scl 工具的版本的更改。
1.5.2. 安装单个软件包组 复制链接链接已复制到粘贴板!
为了更轻松地安装某些组件,如集成的开发环境或软件开发工具链,Red Hat Developer Toolset 随多个 meta 软件包一起分发,允许您安装所选软件包组,如 表 1.3 “Red Hat Developer Toolset Meta Packages” 所述。
| 软件包名称 | 描述 | 安装的组件 |
|---|---|---|
| devtoolset-9-perftools | 性能监控工具 | SystemTap, Valgrind, OProfile, Dyninst |
| devtoolset-9-toolchain | 开发和调试工具 | gcc, make, GDB, binutils, elfutils, dwz, memstomp, strace, ltrace |
要安装其中任何一个 meta 软件包:
yum install package_name
# yum install package_name
使用您要安装的 meta 软件包列表替换 package_name。例如,只安装开发和调试依赖于它的软件包:
yum install devtoolset-9-toolchain
# yum install devtoolset-9-toolchain
另外,您可以选择安装所有可用的组件,如 第 1.5.1 节 “安装所有可用组件” 所述。
1.5.3. 安装可选软件包 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 提供了很多默认未安装的可选软件包。列出系统中可用的、但未安装的所有 Red Hat Developer Toolset 软件包:
yum list available devtoolset-9-\*
$ yum list available devtoolset-9-\*
安装这些可选软件包:
yum install package_name
# yum install package_name
使用您要安装的软件包列表替换 package_name。例如,要安装 devtoolset-9-gdb-gdbserver 和 devtoolset-9-gdb-doc 软件包:
yum install devtoolset-9-gdb-gdbserver devtoolset-9-gdb-doc
# yum install devtoolset-9-gdb-gdbserver devtoolset-9-gdb-doc
1.5.4. 安装调试信息 复制链接链接已复制到粘贴板!
要为任何 Red Hat Developer Toolset 软件包安装调试信息,请确保已安装了 yum-utils 软件包并运行:
debuginfo-install package_name
# debuginfo-install package_name
例如,要为 devtoolset-9-dwz 软件包安装调试信息:
debuginfo-install devtoolset-9-dwz
# debuginfo-install devtoolset-9-dwz
请注意,为了使用这个命令,您需要使用这些软件包访问存储库。如果您的系统在 Red Hat Subscription Management 中注册,请启用 rhel-variant-rhscl-version-debug-rpms 存储库,如 第 1.4 节 “访问 Red Hat Developer Toolset” 所述。有关如何访问 debuginfo 软件包的详情,请参考 https://access.redhat.com/site/solutions/9907。
devtoolset-9-package_name-debuginfo 软件包可以与基础 Red Hat Enterprise Linux 系统或其他版本的 Red Hat Developer Toolset 冲突。这个冲突也会在多 lib 环境中发生,其中 64 位 debuginfo 软件包与 32 位 debuginfo 软件包冲突。
在安装 Red Hat Developer Toolset 9.1 前手动卸载冲突的 debuginfo 软件包,并在需要时只安装相关的 debuginfo 软件包。
1.6. 更新 Red Hat Developer Toolset 复制链接链接已复制到粘贴板!
1.6.1. 更新至次版本 复制链接链接已复制到粘贴板!
当有新的 Red Hat Developer Toolset 次版本可用时,更新您的 Red Hat Enterprise Linux 安装:
yum update
# yum update
这会更新 Red Hat Enterprise Linux 系统上的所有软件包,包括开发、调试和性能监控工具的 Red Hat Developer Toolset 版本,以及其他依赖的软件包。
使用 Red Hat Developer Toolset 需要删除任何早期的预发布版本。另外,无法从 Red Hat Developer Toolset 的预发布版本(包括 beta 版本)升级到 Red Hat Developer Toolset 9.1。如果您之前已安装了 Red Hat Developer Toolset 的任何预发布版本,请从您的系统中卸载它,如 第 1.7 节 “卸载 Red Hat Developer Toolset” 所述,并安装新版本,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
1.6.2. 更新至主版本 复制链接链接已复制到粘贴板!
当有新的 Red Hat Developer Toolset 主版本可用时,您可以并行安装它。有关如何在您的系统上安装 Red Hat Developer Toolset 的详情,请参考 第 1.5 节 “安装 Red Hat Developer Toolset”。
1.7. 卸载 Red Hat Developer Toolset 复制链接链接已复制到粘贴板!
从您的系统卸载 Red Hat Developer Toolset 软件包:
yum remove devtoolset-9\* libasan libatomic libcilkrts libitm liblsan libtsan libubsan
# yum remove devtoolset-9\* libasan libatomic libcilkrts libitm liblsan libtsan libubsan
这会从系统中删除 GNU Compiler Collection、GNU Debugger、binutils 以及作为 Red Hat Developer Toolset 的一部分的其他软件包。
Red Hat Enterprise Linux 7 的 Red Hat Developer Toolset 9.1 不再包含 libatomic 和 libitm 库,以上命令会尝试删除,因为系统上 Red Hat Developer Toolset 组件不需要它们。然而,即使在 Red Hat Enterprise Linux 7 中,上述命令也可以按预期工作。
请注意,Red Hat Developer Toolset 提供的卸载工具不会影响这些工具的 Red Hat Enterprise Linux 系统版本。
1.8. 使用 Red Hat Developer Toolset 容器镜像 复制链接链接已复制到粘贴板!
Docker 格式的容器镜像 可用于在虚拟软件容器中运行 Red Hat Developer Toolset 组件,从而将其与主机系统隔离,并允许其快速部署。有关 Red Hat Developer Toolset docker 格式的容器镜像和 Red Hat Developer Toolset Dockerfile 的详细信息,请参阅使用 Red Hat Software Collections Container Images。
docker 软件包(包含 Docker 守护进程、命令行工具和其他必要的组件)用于构建和使用 docker 格式的容器镜像,目前仅适用于 Red Hat Enterprise Linux 7 产品的服务器变体。
按照 RHEL 7 中获取 Docker 中的说明,设置构建和使用 docker 格式的容器镜像的环境。
1.9. 其它资源 复制链接链接已复制到粘贴板!
有关 Red Hat Developer Toolset 和 Red Hat Enterprise Linux 的更多信息,请参阅以下列出的资源。
在线文档
- 红帽订阅管理 指南集合 - 红帽订阅管理指南集合提供了有关如何管理 Red Hat Enterprise Linux 上的订阅的详细信息。
- Red Hat Developer Toolset 9.1 发行注记 - Red Hat Developer Toolset 9.1 发行注记 包含更多信息。
- Red Hat Enterprise Linux 7 开发人员指南 - Red Hat Enterprise Linux 7 的开发者 指南 提供了有关 Eclipse IDE、库和运行时支持、编译和构建、调试和分析的更多信息。
- Red Hat Enterprise Linux 7 安装指南 - Red Hat Enterprise Linux 7 安装指南 解释了如何获取、安装和更新系统。
- Red Hat Enterprise Linux 7 系统管理员指南 - Red Hat Enterprise Linux 7 系统管理员指南 记录了有关部署、配置和管理 Red Hat Enterprise Linux 7 的相关信息。
- 使用红帽软件集合容器镜像 - 本书提供了有关如何使用基于红帽软件集合的容器镜像的信息。可用的容器镜像包括应用程序、守护进程、数据库和 Red Hat Developer Toolset 容器镜像。镜像可以在 Red Hat Enterprise Linux 7 服务器和 Red Hat Enterprise Linux Atomic Host 上运行。
- 开始使用 Red Hat Systems 上的 Docker 格式容器镜像 - 本指南全面概述了在 Red Hat Enterprise Linux 7 和 Red Hat Enterprise Linux Atomic 上构建和使用 docker 格式的容器镜像。
另请参阅
- 附录 B, 版本 9.1 的变化 - 与之前版本的 Red Hat Developer Toolset 工具版本相比的变化和改进列表。
部分 II. 开发工具 复制链接链接已复制到粘贴板!
第 2 章 GNU Compiler Collection (GCC) 复制链接链接已复制到粘贴板!
GNU Compiler Collection (通常是缩写 GCC )是一个可移植编译器套件,支持各种编程语言。
Red Hat Developer Toolset 与 GCC 9.3.1 一起发布。此版本比 Red Hat Enterprise Linux 中包含的版本更新,并提供很多程序错误修复和增强。
2.1. GNU C Compiler 复制链接链接已复制到粘贴板!
2.1.1. 安装 C Compiler 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU C 编译器由 devtoolset-9-gcc 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.1.2. 使用 C Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 C 程序,请运行 gcc 编译器,如下所示:
scl enable devtoolset-9 'gcc -o output_file source_file...'
$ scl enable devtoolset-9 'gcc -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。要在命令行上编译目标文件,请执行以下操作:
scl enable devtoolset-9 'gcc -o object_file -c source_file'
$ scl enable devtoolset-9 'gcc -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,编译器会创建一个名为 的文件,其源文件带有 .o 文件扩展名。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-9 'gcc -o output_file object_file...'
$ scl enable devtoolset-9 'gcc -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset gcc 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时间点上使用的 gcc 版本:
which gcc
$ which gcc
Red Hat Developer Toolset 的 gcc 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset gcc 相匹配:
gcc -v
$ gcc -v
例 2.1. 在命令行中编译 C 程序
考虑名为 hello.c 的源文件,其内容如下:
在命令行中使用 Red Hat Developer Toolset 的 gcc 编译器编译此源代码:
scl enable devtoolset-9 'gcc -o hello hello.c'
$ scl enable devtoolset-9 'gcc -o hello hello.c'
这会在当前工作目录中创建一个名为 hello 的新二进制文件。
2.1.3. 运行 C 程序 复制链接链接已复制到粘贴板!
当 gcc 编译程序时,它会创建一个可执行的二进制文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:
./file_name
$ ./file_name
例 2.2. 在命令行中运行 C 程序
假设您已成功编译了 hello 二进制文件,如 例 2.1 “在命令行中编译 C 程序” 所示,您可以通过在 shell 提示符后输入以下内容来运行该文件:
./hello Hello, World!
$ ./hello
Hello, World!
2.2. GNU C++ Compiler 复制链接链接已复制到粘贴板!
2.2.1. 安装 C++ 编译器 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU C++ 编译器由 devtoolset-9-gcc-c++ 软件包提供,并自动安装 devtoolset-9-toolchain 软件包,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.2.2. 使用 C++ Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 C++ 程序,请运行 g++ 编译器,如下所示:
scl enable devtoolset-9 'g++ -o output_file source_file...'
$ scl enable devtoolset-9 'g++ -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,g++ 编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:
scl enable devtoolset-9 'g++ -o object_file -c source_file'
$ scl enable devtoolset-9 'g++ -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,g++ 编译器将使用 .o 文件扩展名创建以源文件命名的文件。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-9 'g++ -o output_file object_file...'
$ scl enable devtoolset-9 'g++ -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset g++ 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候使用的 g++ 版本:
which g++
$ which g++
Red Hat Developer Toolset 的 g++ 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset g++ 的版本号匹配:
g++ -v
$ g++ -v
例 2.3. 在命令行中编译 C++ 程序
考虑一个名为 hello.cpp 的源文件,其内容如下:
在命令行中使用 Red Hat Developer Toolset 中的 g++ 编译器编译此源代码:
scl enable devtoolset-9 'g++ -o hello hello.cpp'
$ scl enable devtoolset-9 'g++ -o hello hello.cpp'
这会在当前工作目录中创建一个名为 hello 的新二进制文件。
2.2.3. 运行 C++ 程序 复制链接链接已复制到粘贴板!
当 g++ 编译程序时,它会创建一个可执行文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:
./file_name
$ ./file_name
例 2.4. 在命令行中运行 C++ 程序
假设您已成功编译了 hello 二进制文件,如 例 2.3 “在命令行中编译 C++ 程序” 所示,您可以运行它:
./hello Hello, World!
$ ./hello
Hello, World!
2.2.4. C++ 兼容性 复制链接链接已复制到粘贴板!
来自 Red Hat Enterprise Linux 版本 5、6 和 7 以及来自 Red Hat Developer Toolset 版本 1、2、3、4 和 6 的所有编译器都与 C++98 模式中的任何其他编译器兼容。
C++11 或 C++14 模式中的编译器只保证在 C++11 或 C++14 模式中与另一个编译器兼容(例如,来自 Red Hat Developer Toolset 6.x)。
- Red Hat Developer Toolset 7.x 和 8.x 中的编译器可以使用 C++17 构建代码,但此功能是实验性的,不受红帽支持。
- 本节中提到的所有兼容性信息只与 GCC C++ 编译器的红帽提供的版本相关。
2.2.4.1. C++ ABI 复制链接链接已复制到粘贴板!
由 Red Hat Developer Toolset 工具明确使用 -std=c++98 or-std=gnu++98 或 -std=gnu++98 构建的任何 C++98 兼容二进制文件或库都可以自由地混合使用 Red Hat Enterprise Linux 5、6 或 7 系统 GCC 构建的二进制文件和共享库。
Red Hat Developer Toolset 的默认语言标准设置为带有 GNU 扩展的 C++14,相当于明确使用 option -std=gnu++14。
当使用相应标志编译的所有 C++ 对象使用 Red Hat Developer Toolset 6 或更高版本构建时,Red Hat Developer Toolset 中支持使用 C++14 语言版本。在 C++98 的默认模式中由 system GCC 编译的对象也兼容,但使用 C++11 或 C++14 模式下使用系统 GCC 编译的对象也不兼容。
只有在使用相应标志编译的所有 C++ 对象都使用相同的 GCC 主版本构建时,在 Red Hat Developer Toolset 中使用 C++17 语言版本是实验性的。因为 Red Hat Developer Toolset 的后续主版本可以使用 GCC 的后续主要版本,所以无法保证使用 -std=c++17 和 -std=gnu++17 选项构建的对象、二进制文件和库的兼容性。
在应用程序中使用 C++11 和 C++14 功能需要仔细考虑上述 ABI 兼容性信息。
使用 Red Hat Enterprise Linux 7 system toolchain GCC 使用 -std=c++0x or -std=gnu++0x 标志构建的对象、二进制文件和库(使用 Red Hat Developer Toolset 中的 GCC 构建)时,明确不支持使用 Red Hat Developer Toolset 中的 GCC 构建的对象、二进制文件和库。
除了上述 C++11 和 C++14 ABI 外,Red Hat Enterprise Linux 应用程序兼容性规格 在 Red Hat Developer Toolset 中保持不变。当使用 Red Hat Developer Toolset 与 Red Hat Developer Toolset 构建的对象与 Red Hat Enterprise Linux 7 工具链(特别是 .o/.a 文件)一起构建时,Red Hat Developer Toolset 工具链应该用于任何链接。这样可确保只有 Red Hat Developer Toolset 提供的较新的库功能在链接时被解决。
添加了用于 SIMD 向量类型的新标准手册,以避免在具有不同长度的系统上出现名称冲突。Red Hat Developer Toolset 中的编译器默认使用新的 mangling。通过在 GCC C++ 编译器调用中添加 -fabi-version=2 或 -fabi-version=3 选项,可以使用前面的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi 选项。
在 Red Hat Enterprise Linux 7 中,GCC C++ 编译器默认使用旧的 mangling,但使用新的 mangling 对支持强别名的目标发出别名。通过向编译器调用中添加 -fabi-version=4 选项,可以使用新的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi 选项。
2.3. GNU Fortran Compiler 复制链接链接已复制到粘贴板!
2.3.1. 安装 Fortran Compiler 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU Fortran 编译器由 devtoolset-9-gcc-gfortran 软件包提供,并自动安装 devtoolset-9-toolchain,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.3.2. 使用 Fortran Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 Fortran 程序,请运行 gfortran 编译器,如下所示:
scl enable devtoolset-9 'gfortran -o output_file source_file...'
$ scl enable devtoolset-9 'gfortran -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:
scl enable devtoolset-9 'gfortran -o object_file -c source_file'
$ scl enable devtoolset-9 'gfortran -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,编译器会创建一个名为 的文件,其源文件带有 .o 文件扩展名。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-9 'gfortran -o output_file object_file...'
$ scl enable devtoolset-9 'gfortran -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset gfortran 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候正在使用的 gfortran 版本:
which gfortran
$ which gfortran
Red Hat Developer Toolset 的 gfortran 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset gfortran 的版本号匹配:
gfortran -v
$ gfortran -v
例 2.5. 在命令行中编译 Fortran 程序
考虑名为 hello.f 的源文件,其内容如下:
program hello print *, "Hello, World!" end program hello
program hello
print *, "Hello, World!"
end program hello
使用 Red Hat Developer Toolset 中的 gfortran 编译器在命令行中编译此源代码:
scl enable devtoolset-9 'gfortran -o hello hello.f'
$ scl enable devtoolset-9 'gfortran -o hello hello.f'
这会在当前工作目录中创建一个名为 hello 的新二进制文件。
2.3.3. 运行 Fortran 程序 复制链接链接已复制到粘贴板!
当 gfortran 编译程序时,它会创建一个可执行的二进制文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:
./file_name
$ ./file_name
例 2.6. 在命令行中运行 Fortran 程序
假设您已成功编译了 hello 二进制文件,如 例 2.5 “在命令行中编译 Fortran 程序” 所示,您可以运行它:
./hello Hello, World!
$ ./hello
Hello, World!
2.4. Red Hat Developer Toolset 中的 GCC 的具体信息 复制链接链接已复制到粘贴板!
库的静态链接
某些最新的库功能被静态链接到使用 Red Hat Developer Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误不会改变这个代码。如果因这个风险开发人员需要重建其应用程序,红帽将使用一个安全勘表进行沟通。
由于这个额外的安全风险,强烈建议开发人员不要静态地将整个应用程序链接在一起。
在进行链接时,在对象文件后指定库
在 Red Hat Developer Toolset 中,库使用 linker 脚本链接,这些脚本可以通过静态存档指定一些符号。这需要确保与多个 Red Hat Enterprise Linux 版本兼容。但是,链接器脚本使用对应的共享对象文件的名称。因此,linker 使用不同于预期的符号处理规则,在指定程序库选项前不识别对象文件所需的符号:
scl enable devtoolset-9 'gcc -lsomelib objfile.o'
$ scl enable devtoolset-9 'gcc -lsomelib objfile.o'
以这种方式使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
scl enable devtoolset-9 'gcc objfile.o -lsomelib'
$ scl enable devtoolset-9 'gcc objfile.o -lsomelib'
请注意,这个建议也适用于使用 GCC 的基本 Red Hat Enterprise Linux 版本。
2.5. 其它资源 复制链接链接已复制到粘贴板!
有关 GNU Compiler Collections 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
GCC (1)- gcc编译器的手册页提供了有关其用法的详细信息;一些例外,
g++接受与相同的命令行选项。显示 Red Hat Developer Toolset 中包含的版本的手册页:gccscl enable devtoolset-9 'man gcc'
$ scl enable devtoolset-9 'man gcc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow gfortran(1)-
gfortran编译器的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man gfortran'
$ scl enable devtoolset-9 'man gfortran'Copy to Clipboard Copied! Toggle word wrap Toggle overflow C++ 标准库文档 - 可以选择安装 C++ 标准库的文档:
yum install devtoolset-9-libstdc++-docs
# yum install devtoolset-9-libstdc++-docsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装后,HTML 文档位于
/opt/rh/devtoolset-9/root/usr/share/doc/devtoolset-9-libstdC++-docs-9.3.1/html/index.html。
在线文档
- Red Hat Enterprise Linux 7 开发人员指南 - Red Hat Enterprise Linux 7 开发者指南 提供有关 GCC 的深入信息。
- 使用 GNU Compiler Collection - 上游 GCC 手册提供对 GNU 编译器及其用法的深入描述。
- GNU C++ 库 - GNU C++ 库文档提供有关标准 C++ 库的 GNU 实现的详细信息。
-
GNU Fortran Compiler - GNU Fortran 编译器文档提供了有关
gfortran的用法的详细信息。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 4 章 binutils - 使用 binutils 的说明,这是一系列二进制工具,用于检查和操作对象文件和二进制文件。
- 第 5 章 elfutils - 使用 elfutils 的说明,这是一组二进制工具来检查和操作 ELF 文件。
- 第 6 章 dwz - 使用 dwz 工具优化 ELF 共享库中包含的 DWARF 调试信息的说明,以及 ELF 可执行文件的大小。
- 第 8 章 GNU 调试器(GDB) - 使用 C、C++ 和 Fortran 调试程序的说明。
第 3 章 GNU make 复制链接链接已复制到粘贴板!
GNU make 实用程序(通常是缩写 make )是一个控制从源文件生成可执行文件的工具。自动决定 复杂程序中的哪些部分已更改,需要重新编译。make 使用名为 Makefiles 的配置文件来控制构建程序的方式。
Red Hat Developer Toolset 与 make 4.2.1 一起发布。此版本比 Red Hat Enterprise Linux 中包含的版本更新,并提供很多程序错误修复和增强。
3.1. 安装 make 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU make 由 devtoolset-9-make 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
3.2. 使用 make 复制链接链接已复制到粘贴板!
要在不使用 Makefile 的情况下构建程序,请运行 make 工具,如下所示:
scl enable devtoolset-9 'make source_file_without_extension'
$ scl enable devtoolset-9 'make source_file_without_extension'
此命令利用为多种编程语言定义的隐式规则,包括 C、C++ 和 Fortran。结果是在当前工作目录中名为 source_file_without_extension 的二进制文件。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您使用 Red Hat Developer Toolset make 运行 shell 会话作为默认值:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候正在使用的版本:
which make
$ which make
Red Hat Developer Toolset 的 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset make 的版本号匹配:
make -v
$ make -v
例 3.1. 使用 make 构建 C 程序
考虑名为 hello.c 的源文件,其内容如下:
使用来自 Red Hat Developer Toolset 的 make 工具定义的隐式规则构建此源代码:
scl enable devtoolset-9 'make hello' cc hello.c -o hello
$ scl enable devtoolset-9 'make hello'
cc hello.c -o hello
这会在当前工作目录中创建一个名为 hello 的新二进制文件。
3.3. 使用 Makefile 复制链接链接已复制到粘贴板!
要构建由多个源文件组成的复杂程序,请利用 名为 Makefile 的配置文件,该文件控制如何编译程序的组件并构建最终可执行文件。Makefile 也可以包含清理工作目录、安装和卸载程序文件以及其他操作的说明。
make 自动使用当前目录中名为 GNUmakefile、makefile 或 Makefile 的文件。要指定另一个文件名,请使用 the -f 选项:
make -f make_file
$ make -f make_file
描述 Makefile 语法的详细信息超出了本指南的范围。请参阅 GNU make,上游 GNU make manual,它提供 GNU make 实用程序、Makefile 语法及其用法的深入描述。
作为安装的一部分,也可以以 Texinfo 格式提供完整的 make 手册。查看这个手册:
scl enable devtoolset-9 'info make'
$ scl enable devtoolset-9 'info make'
例 3.2. 使用 Makefile 构建 C 程序
考虑以下名为 Makefile 的通用 Makefile,用于构建 例 3.1 “使用 make 构建 C 程序” 中引入的简单 C 程序。Makefile 定义一些变量并指定四个 规则,它们由 目标 及其 方法 组成。请注意,配有方法的行必须以 TAB 字符开头:
要使用此 Makefile 构建 hello.c 程序,请运行 make 工具:
scl enable devtoolset-9 'make' gcc -c -Wall hello.c -o hello.o gcc hello.o -o hello
$ scl enable devtoolset-9 'make'
gcc -c -Wall hello.c -o hello.o
gcc hello.o -o hello
这会在当前工作目录中创建一个新的对象文件 hello.o 和一个名为 hello 的新二进制文件。
要清理工作目录,请运行:
scl enable devtoolset-9 'make clean' rm -rf hello.o hello
$ scl enable devtoolset-9 'make clean'
rm -rf hello.o hello
这会从工作目录中删除对象和二进制文件。
3.4. 其它资源 复制链接链接已复制到粘贴板!
有关 GNU make 工具及其功能的更多信息,请参阅以下列出的资源。
安装的文档
make(1)-
make工具的手册页提供了有关其使用情况的信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man make'
$ scl enable devtoolset-9 'man make'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Texinfo 格式也提供了完整的 make 手册(包括 Makefile 语法的详细信息)。显示 Red Hat Developer Toolset 中包含的版本的信息手册:
scl enable devtoolset-9 'info make'
$ scl enable devtoolset-9 'info make'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在线文档
- GNU make - 上游 GNU make manual 提供了对 GNU make 实用程序、Makefile 语法及其用法的深入描述。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 2 章 GNU Compiler Collection (GCC) - 使用 GNU Compiler Collection 的说明,它是一个可移植的编译器套件,支持各种编程语言。
- 第 4 章 binutils - 使用 binutils 的说明,这是一系列二进制工具,用于检查和操作对象文件和二进制文件。
- 第 5 章 elfutils - 使用 elfutils 的说明,这是一组二进制工具来检查和操作 ELF 文件。
- 第 6 章 dwz - 使用 dwz 工具优化 ELF 共享库中包含的 DWARF 调试信息的说明,以及 ELF 可执行文件的大小。
- 第 8 章 GNU 调试器(GDB) - 使用 C、C++ 和 Fortran 调试程序的说明。
第 4 章 binutils 复制链接链接已复制到粘贴板!
binutils 是各种二进制工具的集合,如 GNU 链接器、GNU 汇编器和其他实用程序,供您检查和操作对象文件和二进制文件。有关与 binutils 的 Red Hat Developer Toolset 版本分发的二进制工具的完整列表,请参阅 表 4.1 “Red Hat Developer Toolset 的 binutils 中包含的工具”。
Red Hat Developer Toolset 与 binutils 2.32 一起发布。这个版本比 Red Hat Enterprise Linux 中包含的版本以及之前的 Red Hat Developer Toolset 版本更新,并提供程序错误修正和增强。
| Name | 描述 |
|---|---|
|
| 将地址转换为文件名和行号。 |
|
| 创建、修改和提取存档中的文件。 |
|
| GNU assembler。 |
|
| 解码 mangled C++ 符号。 |
|
| 将 DWARF 对象文件合并到单个 DWARF 软件包文件中。 |
|
| 检查并编辑 ELF 文件。 |
|
| 显示性能分析信息。 |
|
| GNU 链接器。 |
|
| GNU 链接器的替代选择。 |
|
| GNU 链接器的另一种替代方案。 |
|
| 列出对象文件中的符号。 |
|
| 复制和转换对象文件。 |
|
| 显示目标文件的信息。 |
|
| 为存档内容生成索引,以便更快地访问此存档。 |
|
| 显示 ELF 文件的信息。 |
|
| 列出对象或存档文件的部分大小。 |
|
| 显示文件中可打印的字符序列。 |
|
| 丢弃对象文件中的所有符号。 |
4.1. 安装 binutils 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,binutils 由 devtoolset-9-binutils 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
4.2. 使用 GNU Assembler 复制链接链接已复制到粘贴板!
要从装配语言程序生成对象文件,请以工具 身份运行 如下:
scl enable devtoolset-9 'as option ... -o object_file source_file'
$ scl enable devtoolset-9 'as option ... -o object_file source_file'
这会在当前工作目录中创建一个名为 object_file 的对象文件。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
在任何时间点上验证使用的版本:
which as
$ which as
Red Hat Developer Toolset 作为 可执行路径将以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset 的版本号匹配,如下所示 :
as -v
$ as -v
4.3. 使用 GNU Linker 复制链接链接已复制到粘贴板!
要从目标文件创建可执行二进制文件或库,请运行 ld 工具,如下所示:
scl enable devtoolset-9 'ld option ... -o output_file object_file ...'
$ scl enable devtoolset-9 'ld option ... -o output_file object_file ...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset ld 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候使用的 ld 版本:
which ld
$ which ld
Red Hat Developer Toolset 的 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset ld 的版本号匹配:
ld -v
$ ld -v
4.4. 使用其他 Binary 工具 复制链接链接已复制到粘贴板!
binutils 提供了除 linker 和 assembler 以外的许多二进制工具。有关这些工具的完整列表,请参阅 表 4.1 “Red Hat Developer Toolset 的 binutils 中包含的工具”。
执行属于 binutils 的任何工具:
scl enable devtoolset-9 'tool option ... file_name'
$ scl enable devtoolset-9 'tool option ... file_name'
有关使用 binutils 发布的工具列表,请参阅 表 4.1 “Red Hat Developer Toolset 的 binutils 中包含的工具”。例如,使用 objdump 工具检查对象文件:
scl enable devtoolset-9 'objdump option ... object_file'
$ scl enable devtoolset-9 'objdump option ... object_file'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 二进制工具运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任意时间点上使用的 binutils 版本:
which objdump
$ which objdump
Red Hat Developer Toolset 的 objdump 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset objdump 的版本号匹配:
objdump -v
$ objdump -v
4.5. Red Hat Developer Toolset 中的 binutils 的具体信息 复制链接链接已复制到粘贴板!
库的静态链接
某些最新的库功能被静态链接到使用 Red Hat Developer Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误不会改变这个代码。如果因这个风险开发人员需要重建其应用程序,红帽将使用一个安全勘表进行沟通。
由于这个额外的安全风险,强烈建议开发人员不要静态地将整个应用程序链接在一起。
在进行链接时,在对象文件后指定库
在 Red Hat Developer Toolset 中,库使用 linker 脚本链接,这些脚本可以通过静态存档指定一些符号。这需要确保与多个 Red Hat Enterprise Linux 版本兼容。但是,链接器脚本使用对应的共享对象文件的名称。因此,linker 使用不同于预期的符号处理规则,在指定程序库选项前不识别对象文件所需的符号:
scl enable devtoolset-9 'ld -lsomelib objfile.o'
$ scl enable devtoolset-9 'ld -lsomelib objfile.o'
以这种方式使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
scl enable devtoolset-9 'ld objfile.o -lsomelib'
$ scl enable devtoolset-9 'ld objfile.o -lsomelib'
请注意,这个建议也适用于使用 binutils 的基本 Red Hat Enterprise Linux 版本。
4.6. 其它资源 复制链接链接已复制到粘贴板!
有关 binutils 的更多信息,请参阅以下列出的资源。
安装的文档
作为(1), ld(1), addr2line(1), ar(1), c++filt(1), dwp(1), elfedit(1), gprof(1), nm(1), objcopy(1), run lib(1), readelf(1), size(1), string (1), strip(1), strip (1), - manual pages for various binutils 工具提供了关于其相应用途的更多信息。 显示 Red Hat Developer Toolset 中包含的版本的手册页:
scl enable devtoolset-9 'man tool'
$ scl enable devtoolset-9 'man tool'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在线文档
- binutils - binutils 文档提供了二进制工具及其用法的深入描述。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 5 章 elfutils - 有关如何使用 elfutils 的信息,这是一组二进制工具来检查和操作 ELF 文件。
- 第 2 章 GNU Compiler Collection (GCC) - 如何编译使用 C、C++ 和 Fortran 编写的程序的信息。
第 5 章 elfutils 复制链接链接已复制到粘贴板!
elfutils 是各种二进制工具的集合,如 eu-objdump、eu-readelf,以及其他允许您检查和操作 ELF 文件的工具。如需与 Red Hat Developer Toolset 版本的 elfutils 一起发布的二进制工具的完整列表,请参阅 表 5.1 “Red Hat Developer Toolset 的 elfutils 中包含的工具”。
Red Hat Developer Toolset 带有 elfutils 0.176。此版本比以前版本的 Red Hat Developer Toolset 包括了,并提供一些程序错误修复和增强。
| Name | 描述 |
|---|---|
|
| 将地址转换为文件名和行号。 |
|
| 创建、修改和提取存档中的文件。 |
|
| 比较两个 ELF 文件的相关部分是否相等。 |
|
| 验证 ELF 文件是否符合 通用 ABI (gABI ) 和特定于处理器的补充 ABI (psABI )规范。 |
|
| 在文件中查找文本重新定位的来源。 |
|
| 创建离线归档以进行调试。 |
|
| 列出对象文件中的符号。 |
|
| 显示目标文件的信息。 |
|
| 为存档内容生成索引,以便更快地访问此存档。 |
|
| 显示 ELF 文件的信息。 |
|
| 列出对象或存档文件的部分大小。 |
|
| 用于取消插入进程和内核的新实用程序。 |
|
| 显示文件中可打印的字符序列。 |
|
| 丢弃对象文件中的所有符号。 |
|
| 使用单独的符号和调试信息合并剥离的文件。 |
5.1. 安装 elfutils 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,elfutils 由 devtoolset-9-elfutils 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
5.2. 使用 elfutils 复制链接链接已复制到粘贴板!
要执行属于 elfutils 的任何工具,请运行以下工具:
scl enable devtoolset-9 'tool option ... file_name'
$ scl enable devtoolset-9 'tool option ... file_name'
有关 elfutils 发布的工具列表,请参阅 表 5.1 “Red Hat Developer Toolset 的 elfutils 中包含的工具”。例如,使用 eu-objdump 工具检查对象文件:
scl enable devtoolset-9 'eu-objdump option ... object_file'
$ scl enable devtoolset-9 'eu-objdump option ... object_file'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 二进制工具运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时间点上使用的 elfutils 版本:
which eu-objdump
$ which eu-objdump
Red Hat Developer Toolset 的 eu-objdump 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号与 Red Hat Developer Toolset eu-objdump 的版本号匹配:
eu-objdump -V
$ eu-objdump -V
5.3. 其它资源 复制链接链接已复制到粘贴板!
有关 elfutils 的更多信息,请参阅以下列出的资源。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 2 章 GNU Compiler Collection (GCC) - 使用 C、C++ 和 Fortran 编写的程序的说明。
- 第 4 章 binutils - 使用 binutils 的说明,这是一系列二进制工具,用于检查和操作对象文件和二进制文件。
- 第 6 章 dwz - 使用 dwz 工具优化 ELF 共享库中包含的 DWARF 调试信息的说明,以及 ELF 可执行文件的大小。
第 6 章 dwz 复制链接链接已复制到粘贴板!
dwz 是一个命令行工具,它试图优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息。为此,dwz 用等效的更小表示替换 DWARF 信息,并使用 DWARF 标准 附录 E 中的技术减少重复的数量。
Red Hat Developer Toolset 与 dwz 0.12 一起发布。
6.1. 安装 dwz 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,dwz 工具由 devtoolset-9-dwz 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
6.2. 使用 dwz 复制链接链接已复制到粘贴板!
要在二进制文件中优化 DWARF 调试信息,请运行 dwz 工具,如下所示:
scl enable devtoolset-9 'dwz option... file_name'
$ scl enable devtoolset-9 'dwz option... file_name'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset dwz 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候正在使用的 dwz 版本:
which dwz
$ which dwz
Red Hat Developer Toolset 的 dwz 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset dwz 的版本号匹配:
dwz -v
$ dwz -v
6.3. 其它资源 复制链接链接已复制到粘贴板!
有关 dwz 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
dwz(1)-
dwz工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man dwz'
$ scl enable devtoolset-9 'man dwz'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 2 章 GNU Compiler Collection (GCC) - 使用 C、C++ 和 Fortran 编写的程序的说明。
- 第 4 章 binutils - 使用 binutils 的说明,这是一系列二进制工具,用于检查和操作对象文件和二进制文件。
- 第 5 章 elfutils - 使用 elfutils 的说明,这是一组二进制工具来检查和操作 ELF 文件。
第 7 章 annobin 复制链接链接已复制到粘贴板!
Annobin 项目由 annobin 插件和 annocheck 程序组成。
anobin 插件扫描 GNU Compiler Collection(GCC)命令行、编译状态和编译过程,并生成 ELF 备注。ELF 备注记录了二进制文件的构建方式,并为 annocheck 程序提供信息来执行安全强化检查。
安全强化检查程序是 annocheck 程序的一部分,默认是启用的。它检查二进制文件,以确定程序是否是使用必要的安全强化选项构建的,并正确编译了。annocheck 能够递归扫描 ELF 对象文件的目录、存档和 RPM 软件包。
这些文件必须采用 ELF 格式。annocheck 不处理任何其他二进制文件类型。
7.1. 安装 Annobin 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,annobin 插件和 annocheck 程序由 devtoolset-9-gcc 软件包提供,并如 第 1.5.3 节 “安装可选软件包” 所述安装。
7.2. 使用 Annobin 插件 复制链接链接已复制到粘贴板!
要将选项传递给带有 gcc 的 annobin 插件,请使用:
scl enable devtoolset-9 'gcc -fplugin=annobin -fplugin-arg-annobin-option file-name'
$ scl enable devtoolset-9 'gcc -fplugin=annobin -fplugin-arg-annobin-option file-name'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候使用的 annobin 版本:
which annobin
$ which annobin
Red Hat Developer Toolset 的 annobin 可执行路径以 /opt 开头。
7.3. 使用 Annocheck 复制链接链接已复制到粘贴板!
使用 annocheck 程序扫描文件、目录或 RPM 软件包:
scl enable devtoolset-9 'annocheck file-name'
$ scl enable devtoolset-9 'annocheck file-name'
annocheck 仅查找 ELF 文件。其他文件类型将被忽略。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证在任意时间点上使用的 annocheck 版本:
which annocheck
$ which annocheck
Red Hat Developer Toolset 的 annocheck 可执行路径将以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset annocheck 的版本号匹配:
annocheck --version
$ annocheck --version
7.4. 其它资源 复制链接链接已复制到粘贴板!
有关 annocheck、annobin 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
annocheck(1)-
annocheck工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man annocheck'
$ scl enable devtoolset-9 'man annocheck'Copy to Clipboard Copied! Toggle word wrap Toggle overflow annobin(1)-
annobin工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man annobin'
$ scl enable devtoolset-9 'man annobin'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
部分 III. 调试工具 复制链接链接已复制到粘贴板!
第 8 章 GNU 调试器(GDB) 复制链接链接已复制到粘贴板!
GNU Debugger 通常是作为 GDB 缩写的命令行工具,可用于调试使用各种编程语言编写的程序。它允许您在被调试的代码中检查内存,控制代码的执行状态,检测特定代码的执行,等等。
Red Hat Developer Toolset 与 GDB 8.3 一起发布。这个版本比 Red Hat Enterprise Linux 中包含的版本和之前的 Red Hat Developer Toolset 版本更新,并提供一些改进和大量程序错误修复。
8.1. 安装 GNU Debugger 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU Debugger 由 devtoolset-9-gdb 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
8.2. 准备用于调试的程序 复制链接链接已复制到粘贴板!
使用调试信息编译程序
要使用 GNU Debugger 读取的调试信息编译 C 程序,请确保 gcc 编译器使用 -g 选项运行:
scl enable devtoolset-9 'gcc -g -o output_file input_file...'
$ scl enable devtoolset-9 'gcc -g -o output_file input_file...'
同样,使用调试信息编译 C++ 程序:
scl enable devtoolset-9 'g++ -g -o output_file input_file...'
$ scl enable devtoolset-9 'g++ -g -o output_file input_file...'
例 8.1. 使用调试信息编译 C 程序
考虑名为 fibonacci.c 的源文件,其内容如下:
使用来自 Red Hat Developer Toolset 的 GCC 以及 GNU Debugger 的调试信息,在命令行中编译该程序:
scl enable devtoolset-9 'gcc -g -o fibonacci fibonacci.c'
$ scl enable devtoolset-9 'gcc -g -o fibonacci fibonacci.c'
这会在当前工作目录中创建一个名为 fibonacci 的新二进制文件。
为现有软件包安装调试信息
要为系统中已安装的软件包安装调试信息:
debuginfo-install package_name
# debuginfo-install package_name
请注意,必须安装 yum-utils 软件包,才能在您的系统中使用 debuginfo-install 工具。
例 8.2. 为 glibc 软件包安装调试信息
为 glibc 软件包安装调试信息:
debuginfo-install glibc Loaded plugins: product-id, refresh-packagekit, subscription-manager --> Running transaction check ---> Package glibc-debuginfo.x86_64 0:2.17-105.el7 will be installed ...
# debuginfo-install glibc
Loaded plugins: product-id, refresh-packagekit, subscription-manager
--> Running transaction check
---> Package glibc-debuginfo.x86_64 0:2.17-105.el7 will be installed
...
8.3. 运行 GNU Debugger 复制链接链接已复制到粘贴板!
要在您要调试的程序上运行 GNU Debugger :
scl enable devtoolset-9 'gdb file_name'
$ scl enable devtoolset-9 'gdb file_name'
这会在交互模式中启动 gdb debugger,并显示默认提示 (gdb)。要退出调试会话并返回到 shell 提示符,请随时运行以下命令:
(gdb) quit
(gdb) quit
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您使用 Red Hat Developer Toolset gdb 作为默认运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时间点上使用的 gdb 版本:
which gdb
$ which gdb
Red Hat Developer Toolset 的 gdb 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset gdb 的版本号匹配:
gdb -v
$ gdb -v
例 8.3. 在 fibonacci Binary 文件中运行 gdb 实用程序
这个示例假设您已成功编译了 fibonacci 二进制文件,如 例 8.1 “使用调试信息编译 C 程序” 所示。
使用 gdb 开始调试 fibonacci :
8.4. 列出源代码 复制链接链接已复制到粘贴板!
查看您要调试的程序的源代码:
(gdb) list
(gdb) list
在开始执行您要调试的程序之前,GDB 会显示源代码的前 10 行,最后使用这个命令的任何后续使用都会列出另一个 10 行。开始执行后,GDB 会显示与执行停止的行相关的行,通常是当您设置断点时。
您还可以显示与特定行周周围的代码:
(gdb) list file_name:line_number
(gdb) list file_name:line_number
同样,要显示与特定功能开头的代码:
(gdb) list file_name:function_name
(gdb) list file_name:function_name
请注意,您可以更改 list 命令显示的行数:
(gdb) set listsize number
(gdb) set listsize number
例 8.4. 列出 fibonacci Binary 文件的源代码
例 8.1 “使用调试信息编译 C 程序” 中列出的 fibonacci.c 文件有 17 行。假设已使用调试信息编译了它,并且希望 gdb 实用程序能够列出整个源代码,您可以运行以下命令来将列出的行数更改为 20:
(gdb) set listsize 20
(gdb) set listsize 20
现在,您可以通过运行不带额外参数的 list 命令来显示您要调试的文件的完整源代码:
8.5. 设置 Breakpoints 复制链接链接已复制到粘贴板!
设置新的明细点
在特定行中设置一个新的断点:
(gdb) break file_name:line_number
(gdb) break file_name:line_number
您还可以在特定功能上设置断点:
(gdb) break file_name:function_name
(gdb) break file_name:function_name
例 8.5. 设置新的明细点
这个示例假设您已使用调试信息编译了 例 8.1 “使用调试信息编译 C 程序” 中列出的 fibonacci.c 文件。
在第 10 行设置一个新的断点:
(gdb) break 10 Breakpoint 1 at 0x4004e5: file fibonacci.c, line 10.
(gdb) break 10
Breakpoint 1 at 0x4004e5: file fibonacci.c, line 10.
列出断点
显示当前设定断点列表:
(gdb) info breakpoints
(gdb) info breakpoints
例 8.6. 列出断点
这个示例假设您遵循了 例 8.5 “设置新的明细点” 中的说明。
显示当前设置断点列表:
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004004e5 in main at fibonacci.c:10
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004004e5 in main at fibonacci.c:10
删除现有断点
删除在特定行设置的断点:
(gdb) clear line_number
(gdb) clear line_number
同样,要删除在特定功能中设置的断点:
(gdb) clear function_name
(gdb) clear function_name
例 8.7. 删除现有的 Breakpoint
这个示例假设您已使用调试信息编译了 例 8.1 “使用调试信息编译 C 程序” 中列出的 fibonacci.c 文件。
在第 7 行设置一个新的断点:
(gdb) break 7 Breakpoint 2 at 0x4004e3: file fibonacci.c, line 7.
(gdb) break 7
Breakpoint 2 at 0x4004e3: file fibonacci.c, line 7.
删除这个断点:
(gdb) clear 7 Deleted breakpoint 2
(gdb) clear 7
Deleted breakpoint 2
8.6. 启动执行 复制链接链接已复制到粘贴板!
要开始执行调试的程序:
(gdb) run
(gdb) run
如果程序接受任何命令行参数,您可以将它们作为参数提供给 run 命令:
(gdb) run argument…
(gdb) run argument…
当达到第一个断点(若有)时,执行将停止,当发生错误或程序终止时。
例 8.8. 执行 fibonacci Binary 文件
这个示例假设您遵循了 例 8.5 “设置新的明细点” 中的说明。
执行 fibonacci 二进制文件:
(gdb) run
Starting program: /home/john/fibonacci
Breakpoint 1, main (argc=1, argv=0x7fffffffe4d8) at fibonacci.c:10
10 printf("%ld ", b);
(gdb) run
Starting program: /home/john/fibonacci
Breakpoint 1, main (argc=1, argv=0x7fffffffe4d8) at fibonacci.c:10
10 printf("%ld ", b);
8.7. 显示当前值 复制链接链接已复制到粘贴板!
gdb 工具允许您显示与程序相关的几乎任何值,从任何复杂性到有效表达式甚至库函数的变量。但是,最常见的任务是显示变量的值。
显示特定变量的当前值:
(gdb) print variable_name
(gdb) print variable_name
例 8.9. 显示变量的当前值
这个示例假设您遵循了 例 8.8 “执行 fibonacci Binary 文件” 中的说明,并在达到第 10 行的断点后停止执行 fibonacci 二进制文件。
显示 和 b 变量的当前值:
(gdb) print a $1 = 0 (gdb) print b $2 = 1
(gdb) print a
$1 = 0
(gdb) print b
$2 = 1
8.8. 继续执行 复制链接链接已复制到粘贴板!
要在达到断点后恢复您调试的程序的执行:
(gdb) continue
(gdb) continue
当达到另一个断点时,执行会再次停止。要跳过一定数量的断点(通常在调试循环时):
(gdb) continue number
(gdb) continue number
gdb 工具还允许您在执行单行代码后停止执行:
(gdb) step
(gdb) step
最后,您可以执行某些行数:
(gdb) step number
(gdb) step number
例 8.10. 继续光纤通道二进制文件的执行
这个示例假设您遵循了 例 8.8 “执行 fibonacci Binary 文件” 中的说明,并在到达第 10 行的断点后停止执行 fibonacci 二进制文件。
恢复执行:
(gdb) continue
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffe4d8) at fibonacci.c:10
10 printf("%ld ", b);
(gdb) continue
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffe4d8) at fibonacci.c:10
10 printf("%ld ", b);
当达到断点时,执行会停止。
执行接下来的三行代码:
(gdb) step 3 13 b = sum;
(gdb) step 3
13 b = sum;
这可让您在分配给 b 前验证 sum 变量的当前值:
(gdb) print sum $3 = 2
(gdb) print sum
$3 = 2
8.9. 其它资源 复制链接链接已复制到粘贴板!
有关 GNU Debugger 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
安装 devtoolset-9-gdb-doc 软件包在 /opt/rh/devtoolset-9/root/usr/share/doc/devtoolset-9-gdb-doc-8.3 目录中以 HTML 和 PDF 格式提供以下文档:
- 使用 GDB 书进行调试,这是具有相同名称的上游材料的副本。本文档的版本与 Red Hat Developer Toolset 中提供的 GDB 版本完全相同。
- GDB 的 Obsolete Annotations 文档,它列出了过时的 GDB 级别 2 注解。
在线文档
- Red Hat Enterprise Linux 7 开发人员指南 - Red Hat Enterprise Linux 7 的开发者 指南 提供了有关 GNU Debugger 和 debug 的更多信息。
- GDB 文档 - 上游 GDB 文档包括 GDB 用户手册 和其他参考材料。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 2 章 GNU Compiler Collection (GCC) - 有关如何编译使用 C、C++ 和 Fortran 编写的程序的更多信息。
- 第 9 章 strace - 使用 strace 工具监控程序使用和信号的系统调用的说明。
- 第 11 章 memstomp - 使用 memstomp 实用程序识别不同标准不允许有重叠内存区域的库函数调用的说明。
第 9 章 strace 复制链接链接已复制到粘贴板!
strace 是命令行的诊断和调试工具,可用于跟踪运行中进程发出和接收的系统调用。它记录每个系统调用、参数及其返回值的名称,以及进程与其他与内核交互的信号,并将此记录打印到标准输出或所选文件。
Red Hat Developer Toolset 带有 strace 5.1。
9.1. 安装 strace 复制链接链接已复制到粘贴板!
在 Red Hat Enterprise Linux 中,strace 工具由 devtoolset-9-strace 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
9.2. 使用 strace 复制链接链接已复制到粘贴板!
要在您要分析的程序上运行 strace 工具:
scl enable devtoolset-9 'strace program argument...'
$ scl enable devtoolset-9 'strace program argument...'
使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:
scl enable devtoolset-9 'strace -p process_id'
$ scl enable devtoolset-9 'strace -p process_id'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset strace 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候使用的 strace 版本:
which strace
$ which strace
Red Hat Developer Toolset 的 strace 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset strace 的版本号匹配:
strace -V
$ strace -V
9.2.1. 将输出重定向到文件 复制链接链接已复制到粘贴板!
默认情况下,strace 会打印每个系统调用的名称、参数以及返回值到标准错误输出。要将此输出重定向到文件,请使用 -o 命令行选项,后跟文件名:
scl enable devtoolset-9 'strace -o file_name program argument...'
$ scl enable devtoolset-9 'strace -o file_name program argument...'
使用文件名替换 file_name。
例 9.1. 将输出重定向到文件
考虑来自 例 8.1 “使用调试信息编译 C 程序” 的 fibonacci 文件稍修改的版本。此可执行文件显示 Fibonacci 序列,并可选择指定要列出此序列的成员数量。对此文件运行 strace 工具,并将 trace 输出重定向到 fibonacci.log :
scl enable devtoolset-9 'strace -o fibonacci.log ./fibonacci 20' 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
$ scl enable devtoolset-9 'strace -o fibonacci.log ./fibonacci 20'
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
这会在当前工作目录中创建一个名为 fibonacci.log 的新纯文本文件。
9.2.2. 追踪所选系统调用 复制链接链接已复制到粘贴板!
要只跟踪所选系统调用集合,请使用 the -e 命令行选项运行 strace 工具:
scl enable devtoolset-9 'strace -e expression program argument...'
$ scl enable devtoolset-9 'strace -e expression program argument...'
使用以逗号分隔的系统调用列表替换 expression,以跟踪或 表 9.1 “-e 选项的常用值” 中列出的任何关键字。有关所有可用值的详细描述,请参阅 strace(1)手册页。
| value | 描述 |
|---|---|
|
| 接受文件名为参数的系统调用。 |
|
| 与进程管理相关的系统调用。 |
|
| 与网络相关的系统调用。 |
|
| 与信号管理相关的系统调用。 |
|
| 与进程间通信相关的系统调用(IPC)。 |
|
| 与文件描述符相关的系统调用。 |
请注意,语法 表达式 是完整 形式的 trace=表达式 的简写。
例 9.2. 追踪所选系统调用
考虑 例 11.1 “使用 memstomp” 中的 员工 文件。在此可执行文件上运行 strace 工具,只跟踪 mmap 和 munmap 系统调用:
9.2.3. 显示时间戳 复制链接链接已复制到粘贴板!
要为每个 trace 加上以小时、分钟和秒内精确的时间为 trace 加上前缀,请使用 the -t 命令行选项运行 strace 工具:
scl enable devtoolset-9 'strace -t program argument...'
$ scl enable devtoolset-9 'strace -t program argument...'
要也显示毫秒,请提供 -t 选项两次:
scl enable devtoolset-9 'strace -tt program argument...'
$ scl enable devtoolset-9 'strace -tt program argument...'
要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:
scl enable devtoolset-9 'strace -r program argument...'
$ scl enable devtoolset-9 'strace -r program argument...'
例 9.3. 显示时间戳
考虑名为 pwd 的可执行文件。在这个文件上运行 strace 工具,并在输出中包括时间戳:
9.2.4. 显示概述 复制链接链接已复制到粘贴板!
要显示执行每个系统调用所需的时间的摘要,执行这些系统调用的次数,以及执行过程中遇到的错误数量,使用 -c 命令行选项运行 strace 工具:
scl enable devtoolset-9 'strace -c program argument...'
$ scl enable devtoolset-9 'strace -c program argument...'
例 9.4. 显示概述
考虑名为 lsblk 的可执行文件。在该文件上运行 strace 工具并显示追踪概述:
9.2.5. 使用系统调用结果篡改 复制链接链接已复制到粘贴板!
模拟系统调用返回的错误有助于识别程序中缺少错误处理。
要使程序收到特定系统调用的结果的通用错误,请使用 -e fault= 选项运行 strace 工具并提供系统调用:
scl enable devtoolset-9 'strace -e fault=syscall program argument...'
$ scl enable devtoolset-9 'strace -e fault=syscall program argument...'
要指定错误类型或返回值,请使用 -e inject= 选项:
scl enable devtoolset-9 'strace -e inject=syscall:error=error-type program argument' scl enable devtoolset-9 'strace -e inject=syscall:retval=return-value program argument'
$ scl enable devtoolset-9 'strace -e inject=syscall:error=error-type program argument'
$ scl enable devtoolset-9 'strace -e inject=syscall:retval=return-value program argument'
请注意,指定错误类型和返回值是互斥的。
例 9.5. 使用系统调用结果篡改
考虑名为 lsblk 的可执行文件。在此文件中运行 strace 工具,并使 mmap () 系统调用返回错误:
9.3. 其它资源 复制链接链接已复制到粘贴板!
有关 strace 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
strace(1)-
strace工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man strace'
$ scl enable devtoolset-9 'man strace'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 10 章 ltrace - 使用 ltrace 工具跟踪程序库调用的说明。
- 第 8 章 GNU 调试器(GDB) - 使用 C、C++ 和 Fortran 调试程序的说明。
- 第 11 章 memstomp - 使用 memstomp 实用程序识别不同标准不允许有重叠内存区域的库函数调用的说明。
第 10 章 ltrace 复制链接链接已复制到粘贴板!
ltrace 是命令行的诊断和调试工具,可用于显示对共享库发出的调用。它使用动态库 hook 机制,这会阻止它追踪对静态链接库的调用。ltrace 也显示库调用的返回值。输出会被打印到标准错误输出或所选文件中。
Red Hat Developer Toolset 与 ltrace 0.7.91 一起发布。虽然基本版本 ltrace 与之前的 Red Hat Developer Toolset 版本相同,但各种改进和程序错误修复有端口。
10.1. 安装 ltrace 复制链接链接已复制到粘贴板!
在 Red Hat Enterprise Linux 中,ltrace 工具由 devtoolset-9-ltrace 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
10.2. 使用 ltrace 复制链接链接已复制到粘贴板!
要在您要分析的程序上运行 ltrace 工具:
scl enable devtoolset-9 'ltrace program argument...'
$ scl enable devtoolset-9 'ltrace program argument...'
使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:
scl enable devtoolset-9 'ltrace -p process_id'
$ scl enable devtoolset-9 'ltrace -p process_id'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset ltrace 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候使用的 ltrace 版本:
which ltrace
$ which ltrace
Red Hat Developer Toolset 的 ltrace 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号与 Red Hat Developer Toolset ltrace 的版本号匹配:
ltrace -V
$ ltrace -V
10.2.1. 将输出重定向到文件 复制链接链接已复制到粘贴板!
默认情况下,ltrace 会打印每个系统调用的名称、其参数以及返回值到标准错误输出。要将此输出重定向到文件,请使用 -o 命令行选项,后跟文件名:
scl enable devtoolset-9 'ltrace -o file_name program argument...'
$ scl enable devtoolset-9 'ltrace -o file_name program argument...'
使用文件名替换 file_name。
例 10.1. 将输出重定向到文件
考虑来自 例 8.1 “使用调试信息编译 C 程序” 的 fibonacci 文件稍修改的版本。此可执行文件显示 Fibonacci 序列,并可选择指定要列出此序列的成员数量。在此文件中运行 ltrace 工具,并将 trace 输出重定向到 fibonacci.log :
scl enable devtoolset-9 'ltrace -o fibonacci.log ./fibonacci 20' 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
$ scl enable devtoolset-9 'ltrace -o fibonacci.log ./fibonacci 20'
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
这会在当前工作目录中创建一个名为 fibonacci.log 的新纯文本文件。
10.2.2. 追踪所选库调用 复制链接链接已复制到粘贴板!
要只跟踪所选库调用集合,请使用 the -e 命令行选项运行 ltrace 工具:
scl enable devtoolset-9 'ltrace -e expression program argument...'
$ scl enable devtoolset-9 'ltrace -e expression program argument...'
使用规则链替换 expression,用于指定要追踪的库调用。规则可以包含用来识别符号名称的模式(如 malloc 或 free)以及标识库 SONAME (如 libc.so)的模式。例如,要追踪对 malloc 和 free 功能的调用,但忽略由 libc 库完成的功能:
scl enable devtoolset-9 'ltrace -e malloc+free-@libc.so* program'
$ scl enable devtoolset-9 'ltrace -e malloc+free-@libc.so* program'
例 10.2. 追踪所选库调用
考虑 ls 命令。在此程序上运行 ltrace 工具,并只跟踪 opendir、readdir 和 closedir 功能调用:
有关可用过滤器表达式的详细描述,请参阅 ltrace(1)手册页。
10.2.3. 显示时间戳 复制链接链接已复制到粘贴板!
要用几小时、分钟和秒内精确的时间为 trace 加上前缀,请使用 the -t 命令行选项运行 ltrace 工具:
scl enable devtoolset-9 'ltrace -t program argument...'
$ scl enable devtoolset-9 'ltrace -t program argument...'
要也显示毫秒,请提供 -t 选项两次:
scl enable devtoolset-9 'ltrace -tt program argument...'
$ scl enable devtoolset-9 'ltrace -tt program argument...'
要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:
scl enable devtoolset-9 'ltrace -r program argument...'
$ scl enable devtoolset-9 'ltrace -r program argument...'
例 10.3. 显示时间戳
考虑 pwd 命令。在此程序上运行 ltrace 工具,并在输出中包括时间戳:
10.2.4. 显示概述 复制链接链接已复制到粘贴板!
要显示执行每个系统调用所需的时间以及执行这些系统调用的次数,请使用 the -c 命令行选项运行 ltrace 工具:
scl enable devtoolset-9 'ltrace -c program argument...'
$ scl enable devtoolset-9 'ltrace -c program argument...'
例 10.4. 显示概述
考虑 lsblk 命令。在此程序上运行 ltrace 工具并显示追踪概述:
10.3. 其它资源 复制链接链接已复制到粘贴板!
有关 ltrace 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
ltrace(1)-
ltrace工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man ltrace'
$ scl enable devtoolset-9 'man ltrace'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在线文档
- ltrace for RHEL 6 和 7 - Red Hat Developer Blog 中的这个文章提供了有关如何使用 ltrace 进行应用程序调试的额外深度信息(包括实际示例)。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 9 章 strace - 使用 strace 工具跟踪程序系统调用的说明。
- 第 8 章 GNU 调试器(GDB) - 使用 C、C++ 和 Fortran 调试程序的说明。
- 第 11 章 memstomp - 使用 memstomp 实用程序识别不同标准不允许有重叠内存区域的库函数调用的说明。
第 11 章 memstomp 复制链接链接已复制到粘贴板!
memstomp 是一个命令行工具,可用于在各种标准不允许此类重叠时识别带有重叠内存区域的功能调用。它截获对 表 11.1 “memstomp 检查函数调用” 中列出的库函数调用,以及每个内存重叠,它会显示一个详细的回溯追踪来帮助您调试问题。
与 Valgrind 类似,memstomp 工具会检查应用程序,而无需重新编译它们。但是,它比这个工具快,因此作为方便的替代工具。
Red Hat Developer Toolset 带有 memstomp 0.1.5。
| 功能 | 描述 |
|---|---|
|
| 将 n 字节从一个内存区域复制到另一个内存区域,并将指针返回到第二个内存区域。 |
|
| 将一个内存区域的最大 n 字节复制到另一个内存区域,并在找到特定字符时停止。如果找不到给定字符,它将指针返回到上次写入字节之后的字节;或者返回 NULL。 |
|
| 将 n 字节从一个内存区域复制到另一个内存区域,并在上一次写入字节后向字节返回指针。 |
|
| 将字符串从一个内存区域复制到另一个内存,并将指针返回到第二个字符串。 |
|
| 将字符串从一个内存区域复制到另一个内存,并将指针返回到第二个字符串的终止 null 字节。 |
|
| 将最多 n 个字符从一个字符串复制到另一个字符串,并将指针返回到第二个字符串。 |
|
| 将最多 n 个字符从一个字符串复制到另一个字符串。它会返回一个指针到第二个字符串的终止 null 字节,或者如果字符串不是 null-terminated,则指向上一次写入字节后面的字节的指针。 |
|
| 将一个字符串附加到另一个字符串,同时覆盖第二个字符串的终止 null 字节,并在其末尾添加一个新字符串。它将指针返回到新字符串。 |
|
| 将最多 n 个字符从一个字符串附加到另一个字符串,同时覆盖第二个字符串的终止 null 字节,并在其末尾添加一个新字符。它将指针返回到新字符串。 |
|
|
与 |
|
|
与 |
|
|
与 |
|
|
与最广泛字符() 功能等效的功能,它将一个数组中最多 n wide 字符复制到另一个数组,并将指针返回到第二个字符串。 |
|
|
与 |
|
|
最大型字符等效于一个数组中最多的 n wide 字符,同时覆盖第二个广泛字符串终止的 null 字节,并在其末尾添加一个新字符。 |
11.1. 安装 memstomp 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,memstomp 工具由 devtoolset-9-memstomp 软件包提供,并自动安装 devtoolset-9-toolchain,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
11.2. 使用 memstomp 复制链接链接已复制到粘贴板!
要在您要分析的程序中运行 memstomp 工具:
scl enable devtoolset-9 'memstomp program argument...'
$ scl enable devtoolset-9 'memstomp program argument...'
要在检测到问题时立即终止分析的程序,请使用 - kill (或用于短)命令行选项运行该工具:
scl enable devtoolset-9 'memstomp --kill program argument...'
$ scl enable devtoolset-9 'memstomp --kill program argument...'
当您分析多线程程序时,尤其建议使用- kill 选项; backtraces 的内部实现不是线程安全,并在没有此命令行选项的情况下在多线程程序上运行 memstomp 工具。
另外,如果您使用调试信息编译分析的程序,或者可以使用这个调试信息,您可以使用 --debug-info (或 )命令行选项生成更详细的回溯追踪:
scl enable devtoolset-9 'memstomp --debug-info program argument...'
$ scl enable devtoolset-9 'memstomp --debug-info program argument...'
有关如何使用二进制文件中构建的调试信息编译程序的详细信息,请参阅 第 8.2 节 “准备用于调试的程序”。有关如何为任何 Red Hat Developer Toolset 软件包安装调试信息的详情,请参考 第 1.5.4 节 “安装调试信息”。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset memstomp 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
例 11.1. 使用 memstomp
在当前工作目录中,创建名为 employee.c 的源文件,其内容如下:
将该程序编译成一个名为 employee 的二进制文件:
scl enable devtoolset-9 'gcc -rdynamic -g -o employee employee.c'
$ scl enable devtoolset-9 'gcc -rdynamic -g -o employee employee.c'
识别带有重叠内存区域的错误函数调用:
11.3. 其它资源 复制链接链接已复制到粘贴板!
有关 memstomp 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
memstomp(1)-
memstomp工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man memstomp'
$ scl enable devtoolset-9 'man memstomp'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 8 章 GNU 调试器(GDB) - 使用 C、C++ 和 Fortran 调试程序的说明。
- 第 9 章 strace - 使用 strace 工具监控程序使用和信号的系统调用的说明。
- 第 13 章 Valgrind - 使用 Valgrind 工具对应用程序进行性能分析并检测内存错误和内存管理问题的说明,如使用未初始化的内存、不正确的分配和释放内存,以及在系统调用中使用不正确的参数。
部分 IV. 性能监控工具 复制链接链接已复制到粘贴板!
第 12 章 SystemTap 复制链接链接已复制到粘贴板!
SystemTap 是一种跟踪和探测工具,允许用户监控整个系统的活动,而无需检测、重新编译、安装和重启。它可通过自定义脚本语言编程,其赋予了其表达性(进行跟踪、过滤和分析)以及访问(查看正在运行的内核和应用程序)。
SystemTap 可以监控各种类型的事件,如内核或应用程序、计时器、追踪点、性能计数器等函数调用。一些包括的示例脚本会生成类似于 netstat、ps、top 和 iostat 的输出,另一些则包括用户打印的功能调用跟踪或用于处理安全漏洞的工具。
Red Hat Developer Toolset 与 SystemTap 4.1 一起发布。此版本比之前版本的 Red Hat Developer Toolset 中包含的版本更新,并提供大量程序错误修复和增强。
| Name | 描述 |
|---|---|
|
| 将指令探测到 C 代码,构建内核模块并将其加载到正在运行的 Linux 内核中。 |
|
| SystemTap 的 Dyninst 后端。 |
|
|
从使用 |
|
| 用作 SystemTap 的远程 shell。 |
|
| 确定和--下载运行 SystemTap 所需的内核信息软件包。 |
|
|
合并每个 CPU 文件。当使用 |
|
| 收集有关系统的重要信息,以便在 SystemTap 中报告错误。 |
|
|
编译服务器,侦听来自 |
12.1. 安装 SystemTap 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,SystemTap 由 devtoolset-9-systemtap 软件包提供,并使用 devtoolset-9-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
要将检测放在 Linux 内核中,SystemTap 可能还需要使用调试信息安装其他软件包。要确定要安装的软件包,请运行 stap-prep 工具,如下所示:
scl enable devtoolset-9 'stap-prep'
$ scl enable devtoolset-9 'stap-prep'
请注意,如果您以 root 用户身份执行这个命令,工具会自动提供安装的软件包。有关如何在您的系统上安装这些软件包的更多信息,请参阅 Red Hat Enterprise Linux 7 SystemTap Beginners Guide。
12.2. 使用 SystemTap 复制链接链接已复制到粘贴板!
执行属于 SystemTap 的任何工具:
scl enable devtoolset-9 'tool option...'
$ scl enable devtoolset-9 'tool option...'
如需与 SystemTap 一起分发的工具列表,请参阅 表 12.1 “使用 SystemTap 分发的工具用于 Red Hat Developer Toolset”。例如,要运行 stap 工具来构建检测模块:
scl enable devtoolset-9 'stap option... argument...'
$ scl enable devtoolset-9 'stap option... argument...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset SystemTap 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任意时间点上使用的 SystemTap 版本:
which stap
$ which stap
Red Hat Developer Toolset 的 stap 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset SystemTap 的版本号匹配:
stap -V
$ stap -V
12.3. 其它资源 复制链接链接已复制到粘贴板!
有关 SystemTap 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
stap(1)-
stap命令的手册页提供了有关其用法的详细信息,以及其他相关手册页的引用。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man stap'
$ scl enable devtoolset-9 'man stap'Copy to Clipboard Copied! Toggle word wrap Toggle overflow staprun(8)-
staprun命令的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man staprun'
$ scl enable devtoolset-9 'man staprun'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在线文档
- Red Hat Enterprise Linux 7 SystemTap Beginners Guide - Red Hat Enterprise Linux 7 的 SystemTap Beginners Guide 提供了 SystemTap 及其用法简介。
- Red Hat Enterprise Linux 7 SystemTap Tapset Reference - Red Hat Enterprise Linux 7 的 SystemTap Tapset 参考 提供了 SystemTap 的详细信息。
- SystemTap 文档 - SystemTap 文档提供有关 SystemTap 的进一步文档,以及 SystemTap 脚本的许多示例。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 13 章 Valgrind - 使用 Valgrind 工具对应用程序进行性能分析并检测内存错误和内存管理问题的说明,如使用未初始化的内存、不正确的分配和释放内存,以及在系统调用中使用不正确的参数。
- 第 14 章 OProfile - 使用 OProfile 工具确定哪个部分代码使用最多 CPU 时间以及原因的说明。
- 第 15 章 Dyninst - 使用 Dyninst 库检测用户空间可执行文件的说明。
第 13 章 Valgrind 复制链接链接已复制到粘贴板!
Valgrind 是一个检测框架,附带很多用于分析应用程序的工具。它可用于检测各种内存错误和内存管理问题,如使用未初始化内存或分配不当的内存,或者识别系统调用中不正确的参数。有关 Valgrind Red Hat Developer Toolset 版本发布的性能分析工具的完整列表,请参阅 表 13.1 “用于 Red Hat Developer Toolset 的 Valgrind 工具”。
Valgrind 通过重写应用程序并检测重写的二进制文件来对应用程序进行性能分析。这可让您对应用程序进行性能分析,而无需重新编译它,但它使 Valgrind 比其他配置集慢得多,特别是在执行非常详细的运行时。因此,它不适用于调试特定于时间的问题或内核空间调试。
Red Hat Developer Toolset 与 Valgrind 3.15.0 一起发布。此版本比之前版本的 Red Hat Developer Toolset 中包含的版本更新,并提供大量程序错误修复和增强。
| Name | 描述 |
|---|---|
| Memcheck | 通过截获系统调用并检查所有读写操作来检测内存管理问题。 |
| cachegrind | 通过模拟级别 1 指令缓存(I1)、级别 1 数据缓存(D1)和统一级别 2 缓存(L2)来识别缓存丢失的来源。 |
| Callgrind | 生成代表函数调用历史记录的调用图。 |
| Helgrind | 在多线程 C、C++ 和使用 POSIX 线程的 Fortran 程序中检测同步错误。 |
| DRD | 检测使用 POSIX 线程原语或任何基于这些 POSIX 线程原语构建的其他线程概念的多线程 C 和 C++ 程序中的错误。 |
| Massif | 监控堆和堆栈使用情况。 |
13.1. 安装 Valgrind 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,Valgrind 由 devtoolset-9-valgrind 软件包提供,并使用 devtoolset-9-perftools 自动安装。
有关如何将 Red Hat Developer Toolset 和相关软件包安装到您的系统的详情请参考 第 1.5 节 “安装 Red Hat Developer Toolset”。
请注意,如果您使用 Valgrind 与 GNU Debugger 结合使用,建议您使用 Red Hat Developer Toolset 中包含的 GDB 版本来确保所有功能都被完全支持。
13.2. 使用 Valgrind 复制链接链接已复制到粘贴板!
要在您要配置集的程序中运行任何 Valgrind 工具:
scl enable devtoolset-9 'valgrind --tool=tool program argument...'
$ scl enable devtoolset-9 'valgrind --tool=tool program argument...'
有关 Valgrind 发布的工具列表,请参阅 表 13.1 “用于 Red Hat Developer Toolset 的 Valgrind 工具”。小写时必须指定-- tool 命令行选项的参数,如果忽略这个选项,则 Valgrind 默认使用 Memcheck。例如,要在程序上运行 Cachegrind,以识别缓存未命中的来源:
scl enable devtoolset-9 'valgrind --tool=cachegrind program argument...'
$ scl enable devtoolset-9 'valgrind --tool=cachegrind program argument...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset Valgrind 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时间点上使用的 Valgrind 版本:
which valgrind
$ which valgrind
Red Hat Developer Toolset 的 valgrind 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset Valgrind 匹配:
valgrind --version
$ valgrind --version
13.3. 其它资源 复制链接链接已复制到粘贴板!
有关 Valgrind 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
Valgrind (1)-
valgrind工具的手册页提供了有关如何使用 Valgrind 的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-9 'man valgrind'
$ scl enable devtoolset-9 'man valgrind'Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Valgrind 的 Valgrind Documentation - HTML 文档位于
/opt/rh/devtoolset-9/root/usr/share/doc/devtoolset-9-valgrind-3.15.0/html/index.html。
在线文档
- Red Hat Enterprise Linux 7 开发人员指南 - Red Hat Enterprise Linux 7 的开发者 指南 提供了有关 Valgrind 及其 Eclipse 插件的更多信息。
- Red Hat Enterprise Linux 7 性能调优指南 - Red Hat Enterprise Linux 7 的性能调优指南 提供了更多有关使用 Valgrind 分析应用程序的详细信息。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 11 章 memstomp - 使用 memstomp 实用程序识别不同标准不允许有重叠内存区域的库函数调用的说明。
- 第 12 章 SystemTap - SystemTap 工具简介以及如何使用它来监控正在运行的系统的活动。
- 第 14 章 OProfile - 使用 OProfile 工具确定哪个部分代码使用最多 CPU 时间以及原因的说明。
- 第 15 章 Dyninst - 使用 Dyninst 库检测用户空间可执行文件的说明。
第 14 章 OProfile 复制链接链接已复制到粘贴板!
OProfile 是一个低开销,系统范围内的配置集程序使用处理器中的 performance-monitoring 硬件来检索系统上内核和可执行文件的信息,如引用内存时、内存被引用、级别 2 缓存(L2)请求的数量,以及收到的硬件中断的数量。它由一个配置实用程序、用于收集数据的守护进程以及多个工具组成,可用于将数据转换为人类可读的形式。有关 Red Hat Developer Toolset 版本 OProfile 发布的完整工具列表,请参阅 表 14.1 “用于 Red Hat Developer Toolset 的 OProfile 提供的工具”。
OProfile 配置集应用程序而无需添加任何检测程序,方法是记录每个第 n 个事件的详细信息。这允许消耗比 Valgrind 少的资源,但也会导致其样本更精确。与 Valgrind 不同,后者仅收集用户空间内单个进程及其子项的数据,OProfile 非常适合收集用户空间和内核空间进程上的系统范围数据,并且需要 root 权限才能运行。
Red Hat Developer Toolset 与 OProfile 1.3.0 一起发布。
| Name | 描述 |
|---|---|
|
| 使用 Linux 性能事件子系统记录单个进程或系统范围的样本。 |
|
| 从性能分析数据生成注解的源文件或装配列表。 |
|
| 生成包含可执行、调试和示例文件的目录。 |
|
|
以与 |
|
| 显示可用事件列表。 |
|
| 将示例数据库文件从外二进制格式转换为原生格式。 |
|
| 将即时(JIT)转储文件转换为可执行文件和可链接格式(ELF)。 |
|
| 生成性能分析会话的镜像和符号摘要。 |
|
| 一个新工具,用于计算监控命令期间发生特定事件的次数。 |
14.1. 安装 OProfile 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,OProfile 由 devtoolset-9-oprofile 软件包提供,并使用 devtoolset-9-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
14.2. 使用 OProfile 复制链接链接已复制到粘贴板!
要运行任何与 OProfile 一起分发的工具:
scl enable devtoolset-9 'tool option...'
# scl enable devtoolset-9 'tool option...'
有关 OProfile 分发的工具列表,请参阅 表 14.1 “用于 Red Hat Developer Toolset 的 OProfile 提供的工具”。例如,使用 ophelp 命令以 XML 格式列出可用事件:
scl enable devtoolset-9 'ophelp -X'
$ scl enable devtoolset-9 'ophelp -X'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset OProfile 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 'bash'
验证您在任何时候使用的 OProfile 版本:
which operf
$ which operf
Red Hat Developer Toolset 的 operf 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset OProfile 的版本号匹配:
operf --version
# operf --version
14.3. 其它资源 复制链接链接已复制到粘贴板!
有关 OProfile 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
OProfile (1)- 名为 oprofile的手册页 提供了 OProfile 和可用工具的概述。显示 Red Hat Developer Toolset 中包含的版本的手册页:
scl enable devtoolset-9 'man oprofile'
$ scl enable devtoolset-9 'man oprofile'Copy to Clipboard Copied! Toggle word wrap Toggle overflow opannotate(1), oparchive(1), operf(1), opgprof(1), ophelp(1), opimport(1), opreport(1)- 有关 OProfile 分发的各种工具的 man page 提供了更多信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:
scl enable devtoolset-9 'man tool'
scl enable devtoolset-9 'man tool'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在线文档
- Red Hat Enterprise Linux 7 开发人员指南 - Red Hat Enterprise Linux 7 开发者指南 提供了有关 OProfile 的更多信息。
-
Red Hat Enterprise Linux 7 系统管理员指南 - Red Hat Enterprise Linux 7 系统管理员指南 文档使用
operf工具。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 12 章 SystemTap - SystemTap 简介以及如何使用它来监控正在运行的系统的活动。
- 第 13 章 Valgrind - 使用 Valgrind 工具对应用程序进行性能分析并检测内存错误和内存管理问题的说明,如使用未初始化的内存、不正确的分配和释放内存,以及在系统调用中使用不正确的参数。
- 第 15 章 Dyninst - 使用 Dyninst 库检测用户空间可执行文件的说明。
第 15 章 Dyninst 复制链接链接已复制到粘贴板!
Dyninst 库提供了一个 应用程序编程接口 (API),用于在执行期间使用用户空间可执行文件。它可用于将代码插入到运行的程序中,更改某些子例程调用,甚至将它们从程序中删除。它作为一个宝贵的调试和性能监控工具。Dyninst API 通常与 SystemTap 一起使用,以允许非root 用户检测用户空间可执行文件。
Red Hat Developer Toolset 与 Dyninst 10.1.0 一起发布。
15.1. 安装 Dyninst 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,Dyninst 库由 devtoolset-9-dyninst 软件包提供,并使用 devtoolset-9-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。此外,建议您安装 devtoolset-9-toolchain 软件包提供的 GNU Compiler Collection。
如果要为二进制文件编写自定义检测,请安装相关的头文件:
yum install devtoolset-9-dyninst-devel
# yum install devtoolset-9-dyninst-devel
您还可以为这个库安装 API 文档:
yum install devtoolset-9-dyninst-doc
# yum install devtoolset-9-dyninst-doc
有关 devtoolset-9-dyninst-doc 软件包中包含的文档的完整列表,请参阅 第 15.3 节 “其它资源”。有关如何在系统中安装可选软件包的详情,请参考 第 1.5 节 “安装 Red Hat Developer Toolset”。
15.2. 使用 Dyninst 复制链接链接已复制到粘贴板!
15.2.1. 在 SystemTap 中使用 Dyninst 复制链接链接已复制到粘贴板!
要将 Dyninst 与 SystemTap 一起使用,以允许非root 用户检测用户空间可执行文件,请使用-- dyninst (or- )命令行选项运行 runtime=dyninststap 命令。这会告知 stap 将 SystemTap 脚本转换为使用 Dyninst 库的 C 代码,将这个 C 代码编译到共享库,然后加载共享库并运行脚本。请注意,执行此操作时,stap 命令还需要指定 -c or -x 命令行选项。
使用 Dyninst 运行时检测可执行文件:
scl enable devtoolset-9 "stap --dyninst -c 'command' option... argument..."
$ scl enable devtoolset-9 "stap --dyninst -c 'command' option... argument..."
同样,使用 Dyninst 运行时检测用户的进程:
scl enable devtoolset-9 "stap --dyninst -x process_id option... argument..."
$ scl enable devtoolset-9 "stap --dyninst -x process_id option... argument..."
有关 Red Hat Developer Toolset 版本 SystemTap 的更多信息,请参阅 第 12 章 SystemTap。有关 SystemTap 及其用法的一般介绍,请参阅 Red Hat Enterprise Linux 7 的 SystemTap Beginners 指南。
例 15.1. 在 SystemTap 中使用 Dyninst
考虑一个名为 exercise.C 的源文件,其内容如下:
此程序提示用户输入起始号,然后计算为 1,对每个迭代调用 print_iteration () 函数,以便将数字打印到标准输出。在命令行中使用 Red Hat Developer Toolset 中的 g++ 编译器编译该程序:
scl enable devtoolset-9 'g++ -g -o exercise exercise.C'
$ scl enable devtoolset-9 'g++ -g -o exercise exercise.C'
现在考虑另一个名为 count.stp 的源文件,其内容如下:
此 SystemTap 脚本打印在执行进程期间调用 print_iteration () 函数的次数。在 练习 二进制文件中运行这个脚本:
15.2.2. 使用 Dyninst 作为独立库 复制链接链接已复制到粘贴板!
在将 Dyninst 库用作应用程序的一部分前,请将 DYNINSTAPI_RT_LIB 环境变量的值设置为运行时库文件的路径:
export DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-9/root/usr/lib64/dyninst/libdyninstAPI_RT.so
$ export DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-9/root/usr/lib64/dyninst/libdyninstAPI_RT.so
这会在当前 shell 会话中设置 DYNINSTAPI_RT_LIB 环境变量。
例 15.2 “使用 Dyninst 作为独立应用程序” 演示了如何编写和构建程序来监控用户空间进程的执行。有关如何使用 Dyninst 的详细信息,请查看 第 15.3 节 “其它资源” 中列出的资源。
例 15.2. 使用 Dyninst 作为独立应用程序
考虑 exercise.C 源文件 例 15.1 “在 SystemTap 中使用 Dyninst” :该程序提示用户输入起始号,然后计数为 1,为每个迭代调用 print_iteration () 函数,以便打印到标准输出的数字。
现在考虑另一个名为 count.C 的源文件,其内容如下:
请注意,在调用任何 Dyninst 库解结构器之前,客户端应用程序应该销毁所有 Bpatch 对象。否则,变异程序可能会意外终止并出现分段错误。要临时解决这个问题,请将 mutator 的 BPatch 对象设置为 main () 函数中的本地变量。或者,如果您需要使用 BPatch 作为全局变量,请在 mutator 退出前手动分离所有 mutatee 进程。
该程序接受进程 ID 和函数名称作为命令行参数,然后打印执行过程中调用函数的次数。您可以使用以下 Makefile 来构建这两个文件:
要在命令行中使用 Red Hat Developer Toolset 的 g++ 编译器编译两个程序,请运行 make 工具:
scl enable devtoolset-9 make g++ -g -I/opt/rh/devtoolset-9/root/usr/include/dyninst count.C -c g++ -g -I/opt/rh/devtoolset-9/root/usr/include/dyninst count.o -L /opt/rh/devtoolset-9/root/usr/lib64/dyninst -ldyninstAPI -o count g++ -g -I/opt/rh/devtoolset-9/root/usr/include/dyninst exercise.C -o exercise
$ scl enable devtoolset-9 make
g++ -g -I/opt/rh/devtoolset-9/root/usr/include/dyninst count.C -c
g++ -g -I/opt/rh/devtoolset-9/root/usr/include/dyninst count.o -L /opt/rh/devtoolset-9/root/usr/lib64/dyninst -ldyninstAPI -o count
g++ -g -I/opt/rh/devtoolset-9/root/usr/include/dyninst exercise.C -o exercise
这会创建一个名为 exercise 的新二进制文件,并在当前工作目录中 计数。
在一个 shell 会话中,按如下所示执行 练习 二进制文件,并等待它提示您输入起始号:
./exercise Enter the starting number:
$ ./exercise
Enter the starting number:
不要输入这个数字。相反,启动另一个 shell 会话,并在提示符下键入以下内容来设置 DYNINSTAPI_RT_LIB 环境变量,并执行 计数 二进制文件:
export DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-9/root/usr/lib64/dyninst/libdyninstAPI_RT.so ./count `pidof exercise` print_iteration Finding function print_iteration(): OK Instrumenting function print_iteration(): OK Waiting for process 8607 to exit...
$ export DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-9/root/usr/lib64/dyninst/libdyninstAPI_RT.so
$ ./count `pidof exercise` print_iteration
Finding function print_iteration(): OK
Instrumenting function print_iteration(): OK
Waiting for process 8607 to exit...
现在,切换回第一个 shell 会话,并根据 练习 程序的要求输入起始号。例如:
当 练习 程序终止时,计数 程序会显示 print_iteration () 函数执行的次数:
Function executed 5 times.
Function executed 5 times.
15.3. 其它资源 复制链接链接已复制到粘贴板!
有关 Dyninst 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
devtoolset-9-dyninst-doc 软件包在 /opt/rh/devtoolset-9/root/usr/share/doc/devtoolset-9-dyninst-doc-10.1.0/ 目录中安装以下文档:
-
Dyninst Programmer 指南 - Dyninst API 的详细描述存储在
DyninstAPI.pdf文件中。 -
DynC API 程序员指南 - DynC API 简介存储在
dynC_API.pdf文件中。 -
ParseAPI Programmer 指南 - ParseAPI 简介存储在
ParseAPI.pdf文件中。 -
PatchAPI Programmer 指南 - PatchAPI 简介存储在
PatchAPI.pdf文件中。 -
ProcControlAPI Programmer 的指南 - ProcControlAPI 的详细描述存储在
ProcControlAPI.pdf文件中。 -
StackwalkerAPI Programmer 的指南 - StackwalkerAPI 的详细描述存储在
stackwalker.pdf文件中。 -
SymtabAPI Programmer 的指南 - SymtabAPI 简介存储在
SymtabAPI.pdf文件中。 -
指令API 参考手册 - 指令API的详细描述存储在
指令API.pdf文件中。
有关如何在系统中安装这个软件包的详情请参考 第 15.1 节 “安装 Dyninst”。
在线文档
- Dyninst Home Page - 项目主页提供了其他文档和相关出版物的链接。
- Red Hat Enterprise Linux 7 SystemTap Beginners Guide - Red Hat Enterprise Linux 7 的 SystemTap Beginners Guide 提供了 SystemTap 及其用法简介。
- Red Hat Enterprise Linux 7 SystemTap Tapset Reference - Red Hat Enterprise Linux 7 的 SystemTap Tapset 参考 提供了 SystemTap 的详细信息。
另请参阅
- 第 1 章 Red Hat Developer Toolset - Red Hat Developer Toolset 概述以及如何在您的系统中安装它。
- 第 12 章 SystemTap - SystemTap 简介以及如何使用它来监控正在运行的系统的活动。
- 第 13 章 Valgrind - 使用 Valgrind 工具对应用程序进行性能分析并检测内存错误和内存管理问题的说明,如使用未初始化的内存、不正确的分配和释放内存,以及在系统调用中使用不正确的参数。
- 第 14 章 OProfile - 使用 OProfile 工具确定哪个部分代码使用最多 CPU 时间以及原因的说明。
部分 V. 编译器工具集 复制链接链接已复制到粘贴板!
第 16 章 编译器工具集文档 复制链接链接已复制到粘贴板!
三个编译器工具集的描述:
- LLVM Toolset
- Go Toolset
- Rust Toolset
已移至 Red Hat Developer Tools 下的单独文档集。
部分 VI. 获得帮助 复制链接链接已复制到粘贴板!
第 17 章 访问红帽产品文档 复制链接链接已复制到粘贴板!
位于 https://access.redhat.com/site/documentation/ 的红帽产品文档充当中央信息源。它目前采用 23 种语言转换,对于每种产品,它以 HTML、PDF 和 EPUB 格式提供不同种类的书本,从发布和技术说明到安装、用户和参考指南。
以下是与本书直接或间接相关的简要文档列表。
Red Hat Developer Toolset
- Red Hat Developer Toolset 9.1 发行注记 - Red Hat Developer Toolset 9.1 发行注记 包含更多信息。
- 使用 Red Hat Software Collections Container Images - 使用 Red Hat Software Collections Container Images 提供了有关获取、配置和使用红帽软件集合附带的容器镜像的说明,包括 Red Hat Developer Toolset 容器镜像。
- Red Hat Software Collections 打包指南 - Software Collections Packaging Guide 解释了 Software Collections 的概念,以及如何创建、构建和扩展它们。
Red Hat Enterprise Linux
- Red Hat Enterprise Linux 7 开发人员指南 - Red Hat Enterprise Linux 7 的开发者 指南 提供有关库和运行时支持、编译和构建、调试和性能分析的更多信息。
- Red Hat Enterprise Linux 7 安装指南 - Red Hat Enterprise Linux 7 安装指南 解释了如何获取、安装和更新系统。
- Red Hat Enterprise Linux 7 系统管理员指南 - Red Hat Enterprise Linux 7 系统管理员指南 记录了有关部署、配置和管理 Red Hat Enterprise Linux 7 的相关信息。
第 18 章 联系全球支持服务 复制链接链接已复制到粘贴板!
除非有自助支持订阅,否则当红帽文档网站和客户门户网站无法提供您的问题的答案时,您还可以联系 全球支持服务 (GSS)。
18.1. 收集所需信息 复制链接链接已复制到粘贴板!
在联系 GSS 之前,应收集多个信息项目。
背景信息
在调用 GSS 前,请确保您手动有以下背景信息:
- 产品运行的硬件类型、制作和型号
- 软件版本
- 最新升级
- 对系统的任何最近更改
- 问题解释和症状
- 有关此问题的任何消息或重要信息
如果您忘记了红帽登录信息,可以在 https://access.redhat.com/site/help/LoginAssistance.html 中恢复。
诊断
还需要 Red Hat Enterprise Linux 的诊断报告。这个报告也称为 sosreport,用于创建报告的程序由 sos 软件包提供。要在您的系统中安装 sos 软件包及其所有依赖项:
yum install sos
# yum install sos
生成报告:
sosreport
# sosreport
如需更多信息,请访问知识库文章 https://access.redhat.com/kb/docs/DOC-3593。
帐户和联系信息
为了帮助您,GSS 需要您的帐户信息来自定义其支持,以及联系信息才能返回给您。当您联系 GSS 时,请确保您有:
- 红帽客户号或红帽网络(RHN)登录名称
- 公司名称
- 联系名称
- 首选联系方法(电话或电子邮件)和联系信息(电话号码或电子邮件地址)
问题严重性
确定问题的严重性对于允许 GSS 团队优先工作非常重要。有四个级别的严重性。
- 严重性级别 1 (紧急)
- 严重影响您在生产环境中使用软件的问题。它停止您的业务操作,且没有相应的临时解决方案。
- 严重性级别 2 (高)
- 软件正常工作的问题,但生产被严重减少。它对业务运营造成严重影响,不存在临时解决方案。
- 严重性级别 3 (中)
- 涉及软件使用部分、非关键损失的问题。通过使用临时解决方案,对您的业务有低影响的中等影响。
- 严重级别 4 (低)
- 常规使用问题、文档错误报告或未来产品改进建议。
有关确定问题的严重性级别的详情请参考 https://access.redhat.com/support/policy/severity。
确定了问题严重性后,通过客户门户网站在 Connect 选项下或 https://access.redhat.com/support/contact/technicalSupport.html 提交服务请求。请注意,您需要您的红帽登录信息才能提交服务请求。
如果严重性级别为 1 或 2,请通过电话通话跟踪您的服务请求。联系信息和业务小时可通过 https://access.redhat.com/support/contact/technicalSupport.html 获得。
如果您有高级订阅,那么在数小时支持后提供严重性 1 和 2 个情况。
高级订阅和标准订阅的周转率均可在 https://access.redhat.com/support/offerings/production/sla.html 中找到。
18.2. 升级问题 复制链接链接已复制到粘贴板!
如果您认为问题没有被正确处理,您可以升级它。升级有两种类型:
- 技术升级
- 如果问题未适当解决,或者您需要更高级的资源来参加。
- 管理升级
- 如果问题变得更为严重,或者您认为它需要更高的优先级。
有关升级的更多信息,包括联系人,请访问 https://access.redhat.com/support/policy/mgt_escalation.html。
18.3. 重新打开服务请求 复制链接链接已复制到粘贴板!
如果更多与关闭的服务请求相关的信息(如问题吊销),您可以通过红帽客户门户网站(位于 https://access.redhat.com/support/policy/mgt_escalation.html )重新打开请求,或通过调用本地支持中心的详情,其详情可在 https://access.redhat.com/support/contact/technicalSupport.html 中找到。
要重新打开服务请求,您需要原始的 service-request 号。
18.4. 其它资源 复制链接链接已复制到粘贴板!
如需更多信息,请参阅以下列出的资源。
在线文档
- 入门 页面作为购买红帽订阅的人员的一个起点,提供 Red Hat Welcome Kit 和 Quick Guide to Red Hat Support for Red Hat Support for download。
- 如何使用 RHEL 自助支持订阅? - 具有自助支持订阅的客户的知识库文章。
- 红帽全球支持服务和公共邮件列表 - 解答有关公共红帽邮件列表的常见问题的知识库文章。
附录 A. 版本 9.0 的更改 复制链接链接已复制到粘贴板!
以下章节记录了 Red Hat Developer Toolset 9.0 中引入的功能和兼容性更改。
A.1. GCC 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 GCC 9.3.1。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
常规改进
- 接受 byte-size 参数的所有命令行选项现在接受 64 位整数和标准 SI 和 IEC 后缀。
-
添加了一个新选项:
-flive-patching=[inline-only-static|inline-clone]。它为实时补丁提供了安全编译。 改进了 GCC 诊断:
-
左侧边缘现在显示行号。要配置此功能,请使用 the
-fno-diagnostics-show-line-numbers选项。 -
现在,源代码的区域可以标记为显示相关信息,例如表达式中的类型。要禁用标签,请使用 the
-fno-diagnostics-show-labels选项。
-
左侧边缘现在显示行号。要配置此功能,请使用 the
-
校准相关的选项
-falign-functions,-falign-labels,-falign-loops, and-falign-jumps现在支持二级对齐,如 example-falign-loops=n:m:n2:m2。 -
添加了一个新的性能分析选项:
-fprofile-filter-files和-fprofile-exclude-files。这些选项有助于过滤检测哪些源文件。 添加了以下内置功能:
-
__builtin_expect_with_probability函数为 optimizer 提供分支预测可能提示。 -
__builtin_has_attribute函数决定是否使用属性声明函数、类型或变量。 -
__builtin_speculation_safe_value函数可帮助缓解不安全的规范执行。
-
-
添加了新的
copy功能属性。将其与功能、变量或类型一起使用。 添加了大量代码生成改进,包括流程间、配置集驱动的和链接时间优化改进,例如:
- 通过将不同的策略用于交换机问题单的子集,改进了切换扩展。策略包括跳过表、位测试和决策树。
- GCOV 命令行工具有所改进。例如,GCOV 工具的中间格式现在是一个新的 JSON 格式。
语言功能
与语言相关的显著变化包括:
C 系列
- C 和 C++ 编译器现在部分支持 OpenMP 规范的版本 5.0。
-
为向量转换添加了新的扩展
__builtin_convervector。 -
添加了一个新的 warning
-Waddress-of-packed-member。它默认是启用的,并从 struct 或 union 中打包成员的地址发出与未对齐的指针值相关的警告。 - 一些现有警告会被改进。
C
-
添加了对
-std=c2x的实验性支持。 -
添加了一个新的 warning
-Wabsolute-value。当有更合适的标准功能可用时,它会警告调用标准函数,以计算参数的绝对值。
C++
添加了新警告:
-
-Wredundant-move选项由-Wextra表示,警告针对冗余调用std::move。 -
当调用 std::
move 时,-Wpessimizing-move 选项表示,在调用std::move时警告。 -
默认情况下,
-Winit-list-lifetime选项为 on。在使用std::initializer_list时,它会发出警告,可能会导致悬停的指针。
-
-
C++ 前端现在对某些 C++2a 草案功能具有实验性支持,并带有
-std=c++2aor-std=gnu++2a标志。 - 改进了错误诊断。
架构和处理器支持
构架和处理器支持的更改包括:
64 位 ARM 架构
现在支持以下处理器(GCC 标识符在括号中提供):
- ARM Cortex-A76 (cortex-a76)
- ARM Cortex-A55/Cortex-A76 DynamIQ big.LITTLE (cortex-a76.cortex-a55)
- ARM Neoverse N1 (neoverse-n1)
- ARM Neoverse E1 处理器(-mcpu=neoverse-e1)
AMD64 和 Intel 64
- 不再支持 Intel MPX (内存保护扩展)。
- 添加了对 Intel PTWRITE 的新 ISA 扩展支持。
- 现在支持名为 Cascade Lake 的 Intel CPU,带有 AVX512 扩展。
IBM Z
- 现在支持 ARCH (13)架构。
-
添加了新向量指令的内置功能。使用
-mzvector选项启用它们。 - 对 ESA 架构 G5 和 G6 的支持已弃用。
A.2. GDB 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 GDB 8.3。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
常规改进
-
GDB 和 GDBserver 现在允许访问 IBM POWER 系统(
PPR,DSCR,TAR,EBB/PMU, 和HTM寄存器)上的额外注册。 -
GDB 和 GDBserver 现在支持 IPv6 连接。使用
[ADDRESS]:PORT表示法或常规ADDRESS:PORT方法传递 IPv6 地址。 - 现在,如果要执行的最后一个命令失败,则批处理模式下的 GDB 现在退出,状态为 1。
- 现在,CLI 和 TUI 提供了终端样式。有关样式命令列表,请参阅 GDB 用户手册的 Output Styling 部分。GNU Source Highlight 程序也可用于源代码样式。
新命令
frame apply [all | COUNT | -COUNT | level LEVEL…] [FLAG]… COMMAND- 仅适用于某些帧。
-
使用
FLAG参数来选择所需的输出,并设置方法来处理在将COMMAND应用到帧时可能得到的错误。
taas COMMAND语法是较短的线程版本,应用 all -s COMMAND。- 适用于所有线程,包括错误和空输出的线程。
faas COMMAND语法是一个较短的帧版本,应用 all -s COMMAND。- 适用于所有帧,包括带有错误和空输出的帧。
tfaas COMMAND语法是较短的线程版本,应用 all -s 帧应用所有 -s COMMAND。- 适用于所有线程的帧,包括带有错误和空输出的帧和线程。
更改的命令
对
帧、选择-frame和info 帧CLI 命令的更改:- 这些命令现在接受帧规格。它可以是 帧级别,也可以是关键字 级别、地址、功能 或 查看,后跟参数。
- 需要按地址选择帧或查看当前后端外帧的关键字。
- 根据级别选择帧不会改变。
-
MI comment
-stack-select-frame保持不变。
目标远程 FILENAME和目标 extended-remote FILENAME-
如果
FILENAME是 Unix 域套接字,GDB 会尝试连接到此套接字,也不会打开FILENAME作为字符设备。
-
如果
info args [-q] [-t TYPEREGEXP] [NAMEREGEXP]info functions [-q] [-t TYPEREGEXP] [NAMEREGEXP]info locals [-q] [-t TYPEREGEXP] [NAMEREGEXP]info variables [-q] [-t TYPEREGEXP] [NAMEREGEXP][NAMEREGEXP] [NAMEREGEXP]前面的四个命令现在有一个新的
[-t TYPEREGEXP]标志。它将匹配的实体返回为与TYPEREGEXP匹配的类型。[-q]标志禁用打印标头或信息信息。info 功能info typeinfo variablesrbreak前面的四个命令现在根据
设置语言选项中选择的语言来确定实体的语法。set language auto选项会自动选择显示实体的语言。线程应用 [all | COUNT | -COUNT] [FLAG]… COMMAND-
添加了新的
[FLAG]参数。使用[FLAG]参数选择所需的输出,并设置方法来处理在将COMMAND应用到帧时可能得到的错误。
-
添加了新的
Python API
-
为
gdb.Inferior类型添加了一个新的progspace属性。它是与该 inferior 关联的程序空间。 -
新的
objfiles方法添加到gdb.Progspace类型中。它返回与该程序空间关联的objfiles列表。 -
新的构造器被添加到
gdb.Value类型中。它用于从 Python 缓冲对象和gdb.Type构造gdb.Value。 -
以下新域被添加来反映对 GDB 内核的更改:
gdb.SYMBOL_LOC_COMMON_BLOCK,gdb.SYMBOL_MODULE_DOMAIN, 和gdb.SYMBOL_COMMON_BLOCK_DOMAIN。
A.3. binutils 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 binutils 2.32。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
Assembler
-
添加了一个新的命令行选项
:--generate-missing-build-notes=yes。如果输入源不包含此类备注,它将创建 GNU Build Attribute 注释。 特定于 AMD64 和 Intel 64 构架:
-
assembler 现在有一个 a
-mvexwig=[0|1]选项来控制 VEX.W-ignored (WIG) VEX 指令的编码。 -
如果生成了 GNU 属性说明,可以使用 new
-mx86-used-note=[yes|no]选项进行选择。这些备注基于输入 assembler。 -
new
-O[2|s]命令行选项启用备用的、较短的指令编码。
-
assembler 现在有一个 a
BFD 链接器
链接器的默认行为是创建单独的代码和数据片段。这使得二进制文件变得更大,但更安全,因为加载程序可以关闭对代码段的写权限。
-
使用命令行选项
-z noseparate-code来禁用此行为。链接器将像以前一样创建一个网段。
-
使用命令行选项
-
使用
-Map命令行选项创建的链接器映射文件现在包含合并 GNU 属性备注时发生的属性更改的详细信息。 --trace选项不再报告存档中的成员。这使得 选项在生成应打包为链接程序错误报告的文件列表时很有用。- 要报告存档中的成员,请给选项两次。
GOLD 链接器
- 改进了引用丢弃部分的重新定位的警告信息。
-
new-
debug=plugin选项可以更轻松地调试与插件相关的问题。 -
new
-z keep_text_section_prefix选项提供与 BFD 链接器的兼容性。 - 改进了对 64 位 ARM 架构的支持。
-
现在支持 Linux ABI 扩展的
.note.gnu.property部分。 - 现在支持 Intel Indirect Branch Tracking (IBT)和 Shadow Stack (AMD64 和 Intel 64 )。
其他二进制工具
-
addr2line,c++filt,nm, 和objdump工具现在对在取消字符串时允许的最大递归量有限制。这个限制的值由 DEMANGLE_RECURSE_LIMIT 常数定义。此常量在作为 Red Hat Developer Toolset 9.0 的一部分提供的 binutils 中的 2048 值。 -
--no-recurse-limit选项可用于删除上述限制。它恢复这些工具的早期版本行为。这个选项允许忽略非常复杂的名称,但它也使工具容易被恶意构建的名称中的堆栈耗尽。 -
ar归档管理器现在支持O修饰符来显示存档中的成员偏移。 -
objdump :--disassemble选项现在使用一个参数,指定 disassembly 的起始符号。Disassembly 将从此符号(直到下一个符号或功能的末尾)继续。 -
64 位 ARM 处理器的不汇编器现在可以显示注释,当系统发现与可能导致无效指令的指令的不一致时所创建的注释。这些备注可以通过对
objdump的"-M 备注"选项打开。当指令和命名寄存器的组合无效时,不汇编器也会创建警告。
A.4. strace 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 strace 5.1。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
License
- 测试套件现在根据 GNU 通用公共许可证版本 2 或更高版本提供。
- 现在,在 GNU Lesser General Public License 版本 2.1 或更高版本的术语下提供了 strace 的其余部分。
行为的变化
-
如果 strace 因它处理的信号而中断(当前为
SIGHUP,SIGINT,SIGQUIT,SIGPIPE, 或SIGTERM),strace 会用这个信号终止自己。 -
现在,
-D选项意味着-I4: 默认 strace 忽略SIGHUP,SIGINT,SIGQUIT,SIGPIPE,SIGTERM,SIGTTIN,SIGTTOU,SIGTSTP(使用-D选项时)。 - 如果尝试重启进程失败并显示 ESRCH,则不再打印诊断信息。此功能地址 BZ#1662936。
- ASCII 转储不再尝试一次读取整个缓冲区。因此,在只转储部分后,它可能会失败并带有诊断信息。现在,为偏移量选择了前面的零量,以适应打印的所有偏移量。
改进
- 实施在接收信号时打印堆栈跟踪。
-
通过
-X选项配置的命名常打印风格支持会被增强。 -
添加了以下系统调用的解码:
clock_gettime64,clock_settime64,clock_adjtime64,clock_getres_time64,clock_nanosleep_time64,timer_gettime64,timer_settime64,timerfd_gettime64, timerfd_settime64 ,timerfd_settime64,utimensat_time64, pselect6_time64, ppoll_time64, io_pgetevents_time64, recvmmsg_time64, mq_timedsend_time64, mq_timedreceive_time64, semtimedop_time64, rt_sigtimedwait_time64, futex_time64, sched_rr_get_interval_time64, pidfd_send_signal, io_uring_setup, io_uring_enter, 和 io_uring_register . -
解码
bpf系统调用。 -
实施了以下 ioctl 命令解码:
BLKGETZONESZ、BBLKGETNRZONES、KVM_CHECK_EXTENSION、NBDHW 和RND*。 -
实施
ssocket 系统调用中的AF_PACKET协议的解码。 -
解码
SOL_XDP套接字选项名称。 -
解码
getsockoptSO_ERROR和SO_TIMESTAMP*_NEW选项。 -
解码
IFLAswig ,NETCONFA solutions ,和SMC_DIAG PPKnetlink属性会被改进。 -
IBM Z 架构上现在提供了对
pkey_mprotect、pkey_alloc和pkey_free系统调用解码。 - 解码直接 IPC 系统调用现在在 IBM POWER 和 IBM Z 构架上提供。
-
解码
kexec_file_load和rseq系统调用现在包括在 64 位 ARM 架构中。
A.5. SystemTap 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 SystemTap 4.1。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
- eBPF 运行时后端可以处理脚本语言(如字符串变量和丰富的格式化的打印)的更多功能。
- 转换器的性能显著提高。
- DWARF4 debuginfo 构造现在可以在优化的 C 代码中提取更多类型的数据。
A.6. Valgrind 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 Valgrind 3.15.0。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
- AMD64:支持 RDRAND 和 F16C 指令集扩展。
-
cachegrind :
cg_annotate工具具有一个新的 option--show-percs。它打印所有事件计数旁边的百分比。 -
Callgrind:
callgrind_annotate有一个新的 option--show-percs。它打印所有事件计数旁边的百分比。 -
Massif:现在为
read-read-inline-info的默认值是 yes。 -
Memcheck: the-
xtree-leak=yes选项现在激活 the-show-leak-kinds=all选项。 添加了一个新选项
:--show-error-list=no|yes。- 它列出了检测到的错误,并在运行结束时被使用。
-
在之前的 Valgrind 版本中,此信息仅在
v详细模式中显示。 -
短选项 等同于
--show-error-list=yes。
DHAT 工具现在是非实验性的。它已被改进,并收到 GUI。更改和新功能包括:
-
要使用 DHAT,请运行一个新的 command--
tool=dhat。不支持旧的command--tool=exp-dhat。 -
已删除
--show-top-n和--sort-by选项。当程序结束时,DHAT 仅打印最小数据并将所有分析数据写入文件中。 添加了一个新的查看器:
dh_view.html。- 它是应在浏览器中运行的 JavaScript 程序。
-
它由
/usr/libexec/valgrind/dh_view.html提供。 - 要查看查看器的配置集结果,请按照在运行完成后打印的消息中的说明操作。
-
DHAT 手册作为
/usr/share/doc/valgrind/html/dh-manual.html提供。
A.7. OProfile 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 OProfile 1.3.0。
从以前的 Red Hat Developer Toolset 版本开始修改了以下功能:
- OProfile 现在可以正确地将 GCC 编译器生成的二进制文件中的样本映射到源代码。它适用于作为 Red Hat Developer Toolset 9.0 的一部分提供的 GCC 编译器。
- 现在,OProfile ocount 可以正确地终止任何创建的子进程,从而导致性能监控硬件设置出现错误。当性能监控硬件设置过程中发生错误时,OProfile ocount 不再创建孤立的进程。
A.8. Dyninst 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.0 带有 Dyninst 10.1.0。
自以前的 Red Hat Developer Toolset 版本以来,以下功能已被改进:
- 使用并行代码分析改进了启动时间。
Dyninst 10.1.0 仅适用于 AMD64 和 Intel 64,且不在 IBM POWER 和 64 位 ARM 架构上运行。
附录 B. 版本 9.1 的变化 复制链接链接已复制到粘贴板!
以下文档文档功能和程序错误修复在 Red Hat Developer Toolset 9.1 中。
B.1. GCC 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 与 GCC 9.3.1 一起发布,它提供大量程序错误修复和增强。
其中一个最显著的程序错误修复是:
在以前的版本中,使用比 9.1.0 更早的 GCC 版本编译的 C++ 对象文件可能会导致 ABI 不兼容。当使用空范围调用 C++
std::rotate算法时,编译的程序可能会意外终止并带有一个 divide-by-zero 错误(作为 SIGFPE 信号)。这个问题已针对 GCC 9.2.0 和以后的版本解决。要临时解决这个问题,请使用空范围重新编译所有可能调用std::rotate的对象。
B.2. make 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 带有 make 4.2.1。
自以前的 Red Hat Developer Toolset 版本以来,以下程序错误已被解决:
在以前的版本中,在使用并行构建时造成缓慢的情况,因为在等待子命令的运行期间,
使子进程可能会暂时变得无响应。因此,带有 high-j值的构建可能会减慢或以较低有效-j值运行。在 Red Hat Developer Toolset 9.1 中,使的作业控制逻辑已变得非阻塞,因此带有 high-j值的构建应该以 full-j速度运行。
B.3. binutils 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 与 binutils 2.32 一起发布。
自以前的 Red Hat Developer Toolset 版本以来,以下程序错误已被解决:
在以前的版本中,当用户指示链接器执行垃圾回收时,链接器可能会错误地从程序中删除弱符号引用。因此,程序被视为未定义符号,即使它是由共享库提供的。在 Red Hat Developer Toolset 9.1 中,这个问题已被解决。弱引用保留在程序中,并在运行时正确解决。
B.4. strace 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 带有 strace 5.1。
自以前的 Red Hat Developer Toolset 版本以来,以下程序错误已被解决:
在以前的版本中,当
strace使用 a-p选项附加到进程时,strace不会为第一个系统调用打印堆栈跟踪,直到影响 traced 进程的内存映射的第一个系统调用。在 Red Hat Developer Toolset 9.1 中,这个问题已被解决。在以前的版本中,
strace在安装了kernel-alt软件包的环境中无法进行一些内部测试。在 Red Hat Developer Toolset 9.1 中,启用以下内容解决了这个问题:- 解码 Linux 内核 Crypto API netlink 协议 ;
- RTM_DELMDB, RTM_GETMDB, 和 RTM_NEWMDB netlink 消息;
FRA_UID_RANGE, NDTA_CONFIG, NDTA_STATS, RTA_MFC_STATS, 和 RTA_VIA netlink 属性。
B.5. ltrace 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 9.1 与 ltrace 0.7.91 一起发布。
自以前的 Red Hat Developer Toolset 版本以来,以下程序错误已被解决:
在以前的版本中,如果您使用任何版本的
elfutils和 DTS 分发的 GCC 编译器版本,ltrace将无法构建。在 Red Hat Developer Toolset 9.1 中,您可以使用提供的 GCC 版本构建ltrace。在这个版本中,在 backtraces 中使用字符串 "unknown" 而不是 " (null) " 解决了一些内部错误。