用户指南
安装和使用 Red Hat Developer Toolset
摘要
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
部分 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 11.0 中的新功能
从 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 | 11.2 | 可移植编译器套件,支持 C、C++ 和 Fortran。 |
| binutils | 2.36 | 用于检查和操作对象文件和二进制文件的二进制工具集合。 |
| elfutils | 0.185 | 用于检查和操作 ELF 文件的二进制工具和其它工具的集合。 |
| dwz | 0.14 | 可优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具,以获得大小。 |
| GDB | 10.2 | 用于 C、C++ 和 Fortran 编写的程序的命令行调试器。 |
| ltrace | 0.7.91 | 一个显示调用程序创建的动态库的调试工具。它还可以监控程序执行的系统调用。 |
| strace | 5.13 | 一个监控程序使用的系统调用以及它收到的信号的调试工具。 |
| memstomp | 0.1.5 | 调试工具来识别对带有重叠内存区域的库函数的调用,这些区域不受各种标准所允许的。 |
| SystemTap | 4.5 | 一个追踪和探测工具,来监控整个系统的活动,而无需检测、重新编译、安装和重启。 |
| Valgrind | 3.17.0 | 一个评测应用程序的工具框架和一些工具,来检测内存错误、识别内存管理问题,并报告系统调用中任何不合适的参数。 |
| OProfile | 1.4.0 | 一个系统范围的配置集,它使用处理器上的性能监控硬件来检索系统上内核和可执行文件的信息。 |
| Dyninst | 11.0.0 | 在执行期间用于检测和使用用户空间可执行文件的库。 |
| make | 4.3 | 一个依赖项跟踪构建自动化工具。 |
| annobin | 9.82 | 构建安全检查工具。 |
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 11.0 包括以下更改:
- GNU Compiler Collection (GCC)的 Red Hat Developer Toolset 版本已升级至版本 11.2,带有许多新功能和程序错误修复。
- Red Hat Developer Toolset 版本的 GNU Debugger (GDB)已升级至版本 10.2,带有许多新功能和程序错误修复。
有关本发行版本中引入的更改和功能的完整列表,请参阅 附录 A, 版本 11.0 中的更改。
1.3. 兼容性 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 适用于多个架构,适用于 Red Hat Enterprise Linux 7。
有关 ABI 兼容性信息,请参阅 第 2.2.4 节 “C++ 兼容性”。
| Runs on Red Hat Enterprise Linux 7.7 | Runs on Red Hat Enterprise Linux 7.9 | |
|---|---|---|
| 使用 Red Hat Enterprise Linux 7.7 构建 | 支持 | 支持 |
| 使用 Red Hat Enterprise Linux 7.9 构建 | 不支持 | 支持 |
架构支持
Red Hat Developer Toolset 在以下构架中提供:
- 64 位 Intel 和 AMD 架构
- IBM Power Systems, big endian
- IBM Power Systems, little endian
- 64-bit 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-11-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-11 软件包:
yum install devtoolset-11
# yum install devtoolset-11
这会安装所有开发、调试和性能监控工具,以及系统的其他依赖软件包。另外,您可以选择只安装所选软件包组,如 第 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-11-perftools | 性能监控工具 | SystemTap, Valgrind, OProfile, Dyninst |
| devtoolset-11-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-11-toolchain
# yum install devtoolset-11-toolchain
另外,您可以选择安装所有可用的组件,如 第 1.5.1 节 “安装所有可用组件” 所述。
1.5.3. 安装可选软件包 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 提供了很多默认未安装的可选软件包。列出系统中可用的、但未安装的所有 Red Hat Developer Toolset 软件包:
yum list available devtoolset-11-\*
$ yum list available devtoolset-11-\*
安装这些可选软件包:
yum install package_name
# yum install package_name
使用您要安装的软件包列表替换 package_name。例如,要安装 devtoolset-11-gdb-gdbserver 和 devtoolset-11-gdb-doc 软件包:
yum install devtoolset-11-gdb-gdbserver devtoolset-11-gdb-doc
# yum install devtoolset-11-gdb-gdbserver devtoolset-11-gdb-doc
1.5.4. 安装调试信息 复制链接链接已复制到粘贴板!
要为任何 Red Hat Developer Toolset 软件包安装调试信息,请确保已安装了 yum-utils 软件包并运行:
debuginfo-install package_name
# debuginfo-install package_name
例如,要为 devtoolset-11-dwz 软件包安装调试信息:
debuginfo-install devtoolset-11-dwz
# debuginfo-install devtoolset-11-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-11-package_name-debuginfo 软件包可以与基础 Red Hat Enterprise Linux 系统或其他版本的 Red Hat Developer Toolset 冲突。这个冲突也会在多 lib 环境中发生,其中 64 位 debuginfo 软件包与 32 位 debuginfo 软件包冲突。
在安装 Red Hat Developer Toolset 11.0 前手动卸载冲突的 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 11.0。如果您之前已安装了 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-11\* libasan libatomic libcilkrts libitm liblsan libtsan libubsan
# yum remove devtoolset-11\* 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 11.0 不再包含 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 11.0 发行注记 - Red Hat Developer Toolset 11.0 发行注记 包含更多信息。
- 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 Enterprise Linux 7 和 Red Hat Enterprise Linux Atomic Host 上构建和使用容器镜像的综合概述。
另请参阅
- 附录 A, 版本 11.0 中的更改 - 与之前版本的 Red Hat Developer Toolset 工具版本相比的变化和改进列表。
部分 II. 开发工具 复制链接链接已复制到粘贴板!
第 2 章 GNU Compiler Collection (GCC) 复制链接链接已复制到粘贴板!
GNU Compiler Collection (通常是缩写 GCC )是一个可移植编译器套件,支持各种编程语言。
Red Hat Developer Toolset 与 GCC 11.2 一起发布。此版本比 Red Hat Enterprise Linux 中包含的版本更新,并提供很多程序错误修复和增强。
2.1. GNU C Compiler 复制链接链接已复制到粘贴板!
2.1.1. 安装 C Compiler 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU C 编译器由 devtoolset-11-gcc 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.1.2. 使用 C Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 C 程序,请运行 gcc 编译器,如下所示:
scl enable devtoolset-11 'gcc -o output_file source_file...'
$ scl enable devtoolset-11 'gcc -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。要在命令行上编译目标文件,请执行以下操作:
scl enable devtoolset-11 'gcc -o object_file -c source_file'
$ scl enable devtoolset-11 'gcc -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,编译器会创建一个名为 的文件,其源文件带有 .o 文件扩展名。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-11 'gcc -o output_file object_file...'
$ scl enable devtoolset-11 'gcc -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset gcc 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'gcc -o hello hello.c'
$ scl enable devtoolset-11 '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-11-gcc-c++ 软件包提供,并自动安装 devtoolset-11-toolchain 软件包,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.2.2. 使用 C++ Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 C++ 程序,请运行 g++ 编译器,如下所示:
scl enable devtoolset-11 'g++ -o output_file source_file...'
$ scl enable devtoolset-11 'g++ -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,g++ 编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:
scl enable devtoolset-11 'g++ -o object_file -c source_file'
$ scl enable devtoolset-11 'g++ -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,g++ 编译器将使用 .o 文件扩展名创建以源文件命名的文件。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-11 'g++ -o output_file object_file...'
$ scl enable devtoolset-11 'g++ -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset g++ 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'g++ -o hello hello.cpp'
$ scl enable devtoolset-11 '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 以及从 any -std 模式中的 Red Hat Developer Toolset 版本 1 到 10 的编译器都与 C++98 模式中的任何其他编译器兼容。
C++11、C++14 或 C++17 模式中的编译器可以保证仅在相同模式中与同一发行版本系列中的另一个编译器兼容。
支持的示例:
- Red Hat Developer Toolset 6.x 中的 C++11 和 C++11
- Red Hat Developer Toolset 6.x 中的 C++14 和 C++14
- Red Hat Developer Toolset 10.x 中的 C++17 和 C++17
- Red Hat Developer Toolset 10.x 中的 GCC 编译器可以使用 C++20 构建代码,但此功能是实验性的,不受红帽支持。
- 本节中提到的所有兼容性信息只与 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 11.0 的默认语言标准设置为带有 GNU 扩展的 C++17,相当于明确使用 option -std=gnu++17。
当使用相应标志编译的所有 C++ 对象使用 Red Hat Developer Toolset 6 或更高版本构建时,Red Hat Developer Toolset 中支持使用 C++14 语言版本。在 C++98 的默认模式中由 system GCC 编译的对象也兼容,但使用 C++11 或 C++14 模式下使用系统 GCC 编译的对象也不兼容。
从 Red Hat Developer Toolset 10.x 开始,使用 C++17 语言版本不再是实验性的,并被红帽支持。使用 C++17 编译的所有 C++ 对象都必须使用 Red Hat Developer Toolset 10.x 或更高版本构建。
在应用程序中使用 C++11、C++14 和 C++17 功能需要仔细考虑上述 ABI 兼容性信息。
使用 Red Hat Developer Toolset 中的 GCC 使用 -std=c++0x 或 -std=gnu++0x 标记构建的对象、二进制文件和库(由 Red Hat Developer Toolset 中的 GCC 使用 C++11 或更高版本构建的语言版本)被明确不被支持。
除了上述 C++11、C++14 和 C++17 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 选项。
在 Red Hat Enterprise Linux 7 中,Red Hat Developer Toolset 中的 GCC C++ 编译器仍然使用 std::string 的旧参考计数实施。这是为了与 Red Hat Enterprise Linux 7 系统工具链 GCC 的兼容性。这意味着,在 Red Hat Enterprise Linux 7 中不提供一些新的 C++17 功能,如 std::pmr::string,即使在使用 Red Hat Developer Toolset 编译器时也是如此。
2.3. GNU Fortran Compiler 复制链接链接已复制到粘贴板!
2.3.1. 安装 Fortran Compiler 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU Fortran 编译器由 devtoolset-11-gcc-gfortran 软件包提供,并自动安装 devtoolset-11-toolchain,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.3.2. 使用 Fortran Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 Fortran 程序,请运行 gfortran 编译器,如下所示:
scl enable devtoolset-11 'gfortran -o output_file source_file...'
$ scl enable devtoolset-11 'gfortran -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:
scl enable devtoolset-11 'gfortran -o object_file -c source_file'
$ scl enable devtoolset-11 'gfortran -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,编译器会创建一个名为 的文件,其源文件带有 .o 文件扩展名。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-11 'gfortran -o output_file object_file...'
$ scl enable devtoolset-11 'gfortran -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset gfortran 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'gfortran -o hello hello.f'
$ scl enable devtoolset-11 '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-11 'gcc -lsomelib objfile.o'
$ scl enable devtoolset-11 'gcc -lsomelib objfile.o'
以这种方式使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
scl enable devtoolset-11 'gcc objfile.o -lsomelib'
$ scl enable devtoolset-11 '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-11 'man gcc'
$ scl enable devtoolset-11 'man gcc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow gfortran(1)-
gfortran编译器的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-11 'man gfortran'
$ scl enable devtoolset-11 'man gfortran'Copy to Clipboard Copied! Toggle word wrap Toggle overflow C++ 标准库文档 - 可以选择安装 C++ 标准库的文档:
yum install devtoolset-11-libstdc++-docs
# yum install devtoolset-11-libstdc++-docsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装后,HTML 文档位于
/opt/rh/devtoolset-11/root/usr/share/doc/devtoolset-11-libstdC++-docs-11.2/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.3 一起发布。此版本比 Red Hat Enterprise Linux 中包含的版本更新,并提供很多程序错误修复和增强。
3.1. 安装 make 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU make 由 devtoolset-11-make 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
3.2. 使用 make 复制链接链接已复制到粘贴板!
要在不使用 Makefile 的情况下构建程序,请运行 make 工具,如下所示:
scl enable devtoolset-11 'make source_file_without_extension'
$ scl enable devtoolset-11 '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-11 'bash'
$ scl enable devtoolset-11 '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-11 'make hello' cc hello.c -o hello
$ scl enable devtoolset-11 '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-11 'info make'
$ scl enable devtoolset-11 'info make'
例 3.2. 使用 Makefile 构建 C 程序
考虑以下名为 Makefile 的通用 Makefile,用于构建 例 3.1 “使用 make 构建 C 程序” 中引入的简单 C 程序。Makefile 定义一些变量并指定四个 规则,它们由 目标 及其 方法 组成。请注意,配有方法的行必须以 TAB 字符开头:
要使用此 Makefile 构建 hello.c 程序,请运行 make 工具:
scl enable devtoolset-11 'make' gcc -c -Wall hello.c -o hello.o gcc hello.o -o hello
$ scl enable devtoolset-11 'make'
gcc -c -Wall hello.c -o hello.o
gcc hello.o -o hello
这会在当前工作目录中创建一个新的对象文件 hello.o 和一个名为 hello 的新二进制文件。
要清理工作目录,请运行:
scl enable devtoolset-11 'make clean' rm -rf hello.o hello
$ scl enable devtoolset-11 'make clean'
rm -rf hello.o hello
这会从工作目录中删除对象和二进制文件。
3.4. 其它资源 复制链接链接已复制到粘贴板!
有关 GNU make 工具及其功能的更多信息,请参阅以下列出的资源。
安装的文档
make(1)-
make工具的手册页提供了有关其使用情况的信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-11 'man make'
$ scl enable devtoolset-11 'man make'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Texinfo 格式也提供了完整的 make 手册(包括 Makefile 语法的详细信息)。显示 Red Hat Developer Toolset 中包含的版本的信息手册:
scl enable devtoolset-11 'info make'
$ scl enable devtoolset-11 '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.36 一起发布。这个版本比 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-11-binutils 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
4.2. 使用 GNU Assembler 复制链接链接已复制到粘贴板!
要从装配语言程序生成对象文件,请以工具 身份运行 如下:
scl enable devtoolset-11 'as option ... -o object_file source_file'
$ scl enable devtoolset-11 'as option ... -o object_file source_file'
这会在当前工作目录中创建一个名为 object_file 的对象文件。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'ld option ... -o output_file object_file ...'
$ scl enable devtoolset-11 '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-11 'bash'
$ scl enable devtoolset-11 '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-11 'tool option ... file_name'
$ scl enable devtoolset-11 'tool option ... file_name'
有关使用 binutils 发布的工具列表,请参阅 表 4.1 “Red Hat Developer Toolset 的 binutils 中包含的工具”。例如,使用 objdump 工具检查对象文件:
scl enable devtoolset-11 'objdump option ... object_file'
$ scl enable devtoolset-11 'objdump option ... object_file'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 二进制工具运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'ld -lsomelib objfile.o'
$ scl enable devtoolset-11 'ld -lsomelib objfile.o'
以这种方式使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
scl enable devtoolset-11 'ld objfile.o -lsomelib'
$ scl enable devtoolset-11 '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-11 'man tool'
$ scl enable devtoolset-11 '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.185。此版本比以前版本的 Red Hat Developer Toolset 包括了,并提供一些程序错误修复和增强。
| Name | 描述 |
|---|---|
|
| 将地址转换为文件名和行号。 |
|
| 创建、修改和提取存档中的文件。 |
|
| 比较两个 ELF 文件的相关部分是否相等。 |
|
| 验证 ELF 文件是否符合 通用 ABI (gABI ) 和特定于处理器的补充 ABI (psABI )规范。 |
|
| 在文件中查找文本重新定位的来源。 |
|
| 创建离线归档以进行调试。 |
|
| 列出对象文件中的符号。 |
|
| 显示目标文件的信息。 |
|
| 为存档内容生成索引,以便更快地访问此存档。 |
|
| 显示 ELF 文件的信息。 |
|
| 列出对象或存档文件的部分大小。 |
|
| 用于取消插入进程和内核的新实用程序。 |
|
| 显示文件中可打印的字符序列。 |
|
| 丢弃对象文件中的所有符号。 |
|
| 使用单独的符号和调试信息合并剥离的文件。 |
5.1. 安装 elfutils 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,elfutils 由 devtoolset-11-elfutils 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
5.2. 使用 elfutils 复制链接链接已复制到粘贴板!
要执行属于 elfutils 的任何工具,请运行以下工具:
scl enable devtoolset-11 'tool option ... file_name'
$ scl enable devtoolset-11 'tool option ... file_name'
有关 elfutils 发布的工具列表,请参阅 表 5.1 “Red Hat Developer Toolset 的 elfutils 中包含的工具”。例如,使用 eu-objdump 工具检查对象文件:
scl enable devtoolset-11 'eu-objdump option ... object_file'
$ scl enable devtoolset-11 'eu-objdump option ... object_file'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 二进制工具运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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.14 一起发布。
6.1. 安装 dwz 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,dwz 工具由 devtoolset-11-dwz 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
6.2. 使用 dwz 复制链接链接已复制到粘贴板!
要在二进制文件中优化 DWARF 调试信息,请运行 dwz 工具,如下所示:
scl enable devtoolset-11 'dwz option... file_name'
$ scl enable devtoolset-11 'dwz option... file_name'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset dwz 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'man dwz'
$ scl enable devtoolset-11 '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-11-gcc 软件包提供,并如 第 1.5.3 节 “安装可选软件包” 所述安装。
7.2. 使用 Annobin 插件 复制链接链接已复制到粘贴板!
要将选项传递给带有 gcc 的 annobin 插件,请使用:
scl enable devtoolset-11 'gcc -fplugin=annobin -fplugin-arg-annobin-option file-name'
$ scl enable devtoolset-11 'gcc -fplugin=annobin -fplugin-arg-annobin-option file-name'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 'bash'
7.3. 使用 Annocheck 复制链接链接已复制到粘贴板!
使用 annocheck 程序扫描文件、目录或 RPM 软件包:
scl enable devtoolset-11 'annocheck file-name'
$ scl enable devtoolset-11 'annocheck file-name'
annocheck 仅查找 ELF 文件。其他文件类型将被忽略。
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'man annocheck'
$ scl enable devtoolset-11 'man annocheck'Copy to Clipboard Copied! Toggle word wrap Toggle overflow annobin(1)-
annobin工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-11 'man annobin'
$ scl enable devtoolset-11 'man annobin'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
部分 III. 调试工具 复制链接链接已复制到粘贴板!
第 8 章 GNU 调试器(GDB) 复制链接链接已复制到粘贴板!
GNU Debugger 通常是作为 GDB 缩写的命令行工具,可用于调试使用各种编程语言编写的程序。它允许您在被调试的代码中检查内存,控制代码的执行状态,检测特定代码的执行,等等。
Red Hat Developer Toolset 使用 GDB 10.2 提供。这个版本比 Red Hat Enterprise Linux 中包含的版本和之前的 Red Hat Developer Toolset 版本更新,并提供一些改进和大量程序错误修复。
8.1. 安装 GNU Debugger 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU Debugger 由 devtoolset-11-gdb 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
8.2. 准备用于调试的程序 复制链接链接已复制到粘贴板!
使用调试信息编译程序
要使用 GNU Debugger 读取的调试信息编译 C 程序,请确保 gcc 编译器使用 -g 选项运行:
scl enable devtoolset-11 'gcc -g -o output_file input_file...'
$ scl enable devtoolset-11 'gcc -g -o output_file input_file...'
同样,使用调试信息编译 C++ 程序:
scl enable devtoolset-11 'g++ -g -o output_file input_file...'
$ scl enable devtoolset-11 'g++ -g -o output_file input_file...'
例 8.1. 使用调试信息编译 C 程序
考虑名为 fibonacci.c 的源文件,其内容如下:
使用来自 Red Hat Developer Toolset 的 GCC 以及 GNU Debugger 的调试信息,在命令行中编译该程序:
scl enable devtoolset-11 'gcc -g -o fibonacci fibonacci.c'
$ scl enable devtoolset-11 '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-11 'gdb file_name'
$ scl enable devtoolset-11 '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-11 'bash'
$ scl enable devtoolset-11 '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-11-gdb-doc 软件包在 /opt/rh/devtoolset-11/root/usr/share/doc/devtoolset-11-gdb-doc-10.2 目录中以 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.13。
9.1. 安装 strace 复制链接链接已复制到粘贴板!
在 Red Hat Enterprise Linux 中,strace 工具由 devtoolset-11-strace 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
9.2. 使用 strace 复制链接链接已复制到粘贴板!
要在您要分析的程序上运行 strace 工具:
scl enable devtoolset-11 'strace program argument...'
$ scl enable devtoolset-11 'strace program argument...'
使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:
scl enable devtoolset-11 'strace -p process_id'
$ scl enable devtoolset-11 'strace -p process_id'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset strace 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'strace -o file_name program argument...'
$ scl enable devtoolset-11 'strace -o file_name program argument...'
使用文件名替换 file_name。
例 9.1. 将输出重定向到文件
考虑来自 例 8.1 “使用调试信息编译 C 程序” 的 fibonacci 文件稍修改的版本。此可执行文件显示 Fibonacci 序列,并可选择指定要列出此序列的成员数量。对此文件运行 strace 工具,并将 trace 输出重定向到 fibonacci.log :
scl enable devtoolset-11 '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-11 '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-11 'strace -e expression program argument...'
$ scl enable devtoolset-11 '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-11 'strace -t program argument...'
$ scl enable devtoolset-11 'strace -t program argument...'
要也显示毫秒,请提供 -t 选项两次:
scl enable devtoolset-11 'strace -tt program argument...'
$ scl enable devtoolset-11 'strace -tt program argument...'
要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:
scl enable devtoolset-11 'strace -r program argument...'
$ scl enable devtoolset-11 'strace -r program argument...'
例 9.3. 显示时间戳
考虑名为 pwd 的可执行文件。在这个文件上运行 strace 工具,并在输出中包括时间戳:
9.2.4. 显示概述 复制链接链接已复制到粘贴板!
要显示执行每个系统调用所需的时间的摘要,执行这些系统调用的次数,以及执行过程中遇到的错误数量,使用 -c 命令行选项运行 strace 工具:
scl enable devtoolset-11 'strace -c program argument...'
$ scl enable devtoolset-11 'strace -c program argument...'
例 9.4. 显示概述
考虑名为 lsblk 的可执行文件。在该文件上运行 strace 工具并显示追踪概述:
9.2.5. 使用系统调用结果篡改 复制链接链接已复制到粘贴板!
模拟系统调用返回的错误有助于识别程序中缺少错误处理。
要使程序收到特定系统调用的结果的通用错误,请使用 -e fault= 选项运行 strace 工具并提供系统调用:
scl enable devtoolset-11 'strace -e fault=syscall program argument...'
$ scl enable devtoolset-11 'strace -e fault=syscall program argument...'
要指定错误类型或返回值,请使用 -e inject= 选项:
scl enable devtoolset-11 'strace -e inject=syscall:error=error-type program argument' scl enable devtoolset-11 'strace -e inject=syscall:retval=return-value program argument'
$ scl enable devtoolset-11 'strace -e inject=syscall:error=error-type program argument'
$ scl enable devtoolset-11 '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-11 'man strace'
$ scl enable devtoolset-11 '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-11-ltrace 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
10.2. 使用 ltrace 复制链接链接已复制到粘贴板!
要在您要分析的程序上运行 ltrace 工具:
scl enable devtoolset-11 'ltrace program argument...'
$ scl enable devtoolset-11 'ltrace program argument...'
使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:
scl enable devtoolset-11 'ltrace -p process_id'
$ scl enable devtoolset-11 'ltrace -p process_id'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset ltrace 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'ltrace -o file_name program argument...'
$ scl enable devtoolset-11 'ltrace -o file_name program argument...'
使用文件名替换 file_name。
例 10.1. 将输出重定向到文件
考虑来自 例 8.1 “使用调试信息编译 C 程序” 的 fibonacci 文件稍修改的版本。此可执行文件显示 Fibonacci 序列,并可选择指定要列出此序列的成员数量。在此文件中运行 ltrace 工具,并将 trace 输出重定向到 fibonacci.log :
scl enable devtoolset-11 '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-11 '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-11 'ltrace -e expression program argument...'
$ scl enable devtoolset-11 'ltrace -e expression program argument...'
使用规则链替换 expression,用于指定要追踪的库调用。规则可以包含用来识别符号名称的模式(如 malloc 或 free)以及标识库 SONAME (如 libc.so)的模式。例如,要追踪对 malloc 和 free 功能的调用,但忽略由 libc 库完成的功能:
scl enable devtoolset-11 'ltrace -e malloc+free-@libc.so* program'
$ scl enable devtoolset-11 '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-11 'ltrace -t program argument...'
$ scl enable devtoolset-11 'ltrace -t program argument...'
要也显示毫秒,请提供 -t 选项两次:
scl enable devtoolset-11 'ltrace -tt program argument...'
$ scl enable devtoolset-11 'ltrace -tt program argument...'
要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:
scl enable devtoolset-11 'ltrace -r program argument...'
$ scl enable devtoolset-11 'ltrace -r program argument...'
例 10.3. 显示时间戳
考虑 pwd 命令。在此程序上运行 ltrace 工具,并在输出中包括时间戳:
10.2.4. 显示概述 复制链接链接已复制到粘贴板!
要显示执行每个系统调用所需的时间以及执行这些系统调用的次数,请使用 the -c 命令行选项运行 ltrace 工具:
scl enable devtoolset-11 'ltrace -c program argument...'
$ scl enable devtoolset-11 'ltrace -c program argument...'
例 10.4. 显示概述
考虑 lsblk 命令。在此程序上运行 ltrace 工具并显示追踪概述:
10.3. 其它资源 复制链接链接已复制到粘贴板!
有关 ltrace 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
ltrace(1)-
ltrace工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-11 'man ltrace'
$ scl enable devtoolset-11 '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-11-memstomp 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
11.2. 使用 memstomp 复制链接链接已复制到粘贴板!
要在您要分析的程序中运行 memstomp 工具:
scl enable devtoolset-11 'memstomp program argument...'
$ scl enable devtoolset-11 'memstomp program argument...'
要在检测到问题时立即终止分析的程序,请使用 - kill (或用于短)命令行选项运行该工具:
scl enable devtoolset-11 'memstomp --kill program argument...'
$ scl enable devtoolset-11 'memstomp --kill program argument...'
当您分析多线程程序时,尤其建议使用- kill 选项; backtraces 的内部实现不是线程安全,并在没有此命令行选项的情况下在多线程程序上运行 memstomp 工具。
另外,如果您使用调试信息编译分析的程序,或者可以使用这个调试信息,您可以使用 --debug-info (或 )命令行选项生成更详细的回溯追踪:
scl enable devtoolset-11 'memstomp --debug-info program argument...'
$ scl enable devtoolset-11 '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-11 'bash'
$ scl enable devtoolset-11 'bash'
例 11.1. 使用 memstomp
在当前工作目录中,创建名为 employee.c 的源文件,其内容如下:
将该程序编译成一个名为 employee 的二进制文件:
scl enable devtoolset-11 'gcc -rdynamic -g -o employee employee.c'
$ scl enable devtoolset-11 'gcc -rdynamic -g -o employee employee.c'
识别带有重叠内存区域的错误函数调用:
11.3. 其它资源 复制链接链接已复制到粘贴板!
有关 memstomp 及其功能的更多信息,请参阅以下列出的资源。
安装的文档
memstomp(1)-
memstomp工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-11 'man memstomp'
$ scl enable devtoolset-11 '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.5 一起发布。此版本比之前版本的 Red Hat Developer Toolset 中包含的版本更新,并提供大量程序错误修复和增强。
| Name | 描述 |
|---|---|
|
| 将指令探测到 C 代码,构建内核模块并将其加载到正在运行的 Linux 内核中。 |
|
| SystemTap 的 Dyninst 后端。 |
|
|
从使用 |
|
| 用作 SystemTap 的远程 shell。 |
|
| 确定和--下载运行 SystemTap 所需的内核信息软件包。 |
|
|
合并每个 CPU 文件。当使用 |
|
| 收集有关系统的重要信息,以便在 SystemTap 中报告错误。 |
|
|
编译服务器,侦听来自 |
12.1. 安装 SystemTap 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,SystemTap 由 devtoolset-11-systemtap 软件包提供,并使用 devtoolset-11-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
要将检测放在 Linux 内核中,SystemTap 可能还需要使用调试信息安装其他软件包。要确定要安装的软件包,请运行 stap-prep 工具,如下所示:
scl enable devtoolset-11 'stap-prep'
$ scl enable devtoolset-11 'stap-prep'
请注意,如果您以 root 用户身份执行这个命令,工具会自动提供安装的软件包。有关如何在您的系统上安装这些软件包的更多信息,请参阅 Red Hat Enterprise Linux 7 SystemTap Beginners Guide。
12.2. 使用 SystemTap 复制链接链接已复制到粘贴板!
执行属于 SystemTap 的任何工具:
scl enable devtoolset-11 'tool option...'
$ scl enable devtoolset-11 'tool option...'
如需与 SystemTap 一起分发的工具列表,请参阅 表 12.1 “使用 SystemTap 分发的工具用于 Red Hat Developer Toolset”。例如,要运行 stap 工具来构建检测模块:
scl enable devtoolset-11 'stap option... argument...'
$ scl enable devtoolset-11 'stap option... argument...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset SystemTap 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'man stap'
$ scl enable devtoolset-11 'man stap'Copy to Clipboard Copied! Toggle word wrap Toggle overflow staprun(8)-
staprun命令的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:scl enable devtoolset-11 'man staprun'
$ scl enable devtoolset-11 '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.17.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-11-valgrind 软件包提供,并使用 devtoolset-11-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-11 'valgrind --tool=tool program argument...'
$ scl enable devtoolset-11 'valgrind --tool=tool program argument...'
有关 Valgrind 发布的工具列表,请参阅 表 13.1 “用于 Red Hat Developer Toolset 的 Valgrind 工具”。小写时必须指定-- tool 命令行选项的参数,如果忽略这个选项,则 Valgrind 默认使用 Memcheck。例如,要在程序上运行 Cachegrind,以识别缓存未命中的来源:
scl enable devtoolset-11 'valgrind --tool=cachegrind program argument...'
$ scl enable devtoolset-11 'valgrind --tool=cachegrind program argument...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset Valgrind 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'man valgrind'
$ scl enable devtoolset-11 'man valgrind'Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Valgrind 的 Valgrind Documentation - HTML 文档位于
/opt/rh/devtoolset-11/root/usr/share/doc/devtoolset-11-valgrind-3.17.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.4.0 一起发布。
| Name | 描述 |
|---|---|
|
| 使用 Linux 性能事件子系统记录单个进程或系统范围的样本。 |
|
| 从性能分析数据生成注解的源文件或装配列表。 |
|
| 生成包含可执行、调试和示例文件的目录。 |
|
|
以与 |
|
| 显示可用事件列表。 |
|
| 将示例数据库文件从外二进制格式转换为原生格式。 |
|
| 将即时(JIT)转储文件转换为可执行文件和可链接格式(ELF)。 |
|
| 生成性能分析会话的镜像和符号摘要。 |
|
| 一个新工具,用于计算监控命令期间发生特定事件的次数。 |
14.1. 安装 OProfile 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,OProfile 由 devtoolset-11-oprofile 软件包提供,并使用 devtoolset-11-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
14.2. 使用 OProfile 复制链接链接已复制到粘贴板!
要运行任何与 OProfile 一起分发的工具:
scl enable devtoolset-11 'tool option...'
# scl enable devtoolset-11 'tool option...'
有关 OProfile 分发的工具列表,请参阅 表 14.1 “用于 Red Hat Developer Toolset 的 OProfile 提供的工具”。例如,使用 ophelp 命令以 XML 格式列出可用事件:
scl enable devtoolset-11 'ophelp -X'
$ scl enable devtoolset-11 'ophelp -X'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset OProfile 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 '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-11 'man oprofile'
$ scl enable devtoolset-11 '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-11 'man tool'
scl enable devtoolset-11 '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 11.0.0 一起发布。
15.1. 安装 Dyninst 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,Dyninst 库由 devtoolset-11-dyninst 软件包提供,并使用 devtoolset-11-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。此外,建议您安装 devtoolset-11-toolchain 软件包提供的 GNU Compiler Collection。
如果要为二进制文件编写自定义检测,请安装相关的头文件:
yum install devtoolset-11-dyninst-devel
# yum install devtoolset-11-dyninst-devel
您还可以为这个库安装 API 文档:
yum install devtoolset-11-dyninst-doc
# yum install devtoolset-11-dyninst-doc
有关 devtoolset-11-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-11 "stap --dyninst -c 'command' option... argument..."
$ scl enable devtoolset-11 "stap --dyninst -c 'command' option... argument..."
同样,使用 Dyninst 运行时检测用户的进程:
scl enable devtoolset-11 "stap --dyninst -x process_id option... argument..."
$ scl enable devtoolset-11 "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-11 'g++ -g -o exercise exercise.C'
$ scl enable devtoolset-11 '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-11/root/usr/lib64/dyninst/libdyninstAPI_RT.so
$ export DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-11/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-11 make g++ -g -I/opt/rh/devtoolset-11/root/usr/include/dyninst count.C -c g++ -g -I/opt/rh/devtoolset-11/root/usr/include/dyninst count.o -L /opt/rh/devtoolset-11/root/usr/lib64/dyninst -ldyninstAPI -o count g++ -g -I/opt/rh/devtoolset-11/root/usr/include/dyninst exercise.C -o exercise
$ scl enable devtoolset-11 make
g++ -g -I/opt/rh/devtoolset-11/root/usr/include/dyninst count.C -c
g++ -g -I/opt/rh/devtoolset-11/root/usr/include/dyninst count.o -L /opt/rh/devtoolset-11/root/usr/lib64/dyninst -ldyninstAPI -o count
g++ -g -I/opt/rh/devtoolset-11/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-11/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-11/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-11-dyninst-doc 软件包在 /opt/rh/devtoolset-11/root/usr/share/doc/devtoolset-11-dyninst-doc-11.0.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 11.0 发行注记 - Red Hat Developer Toolset 11.0 发行注记 包含更多信息。
- 使用 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. 版本 11.0 中的更改 复制链接链接已复制到粘贴板!
以下小节记录了 Red Hat Developer Toolset 11.0 中引入的功能和兼容性更改。列表未满,并将更新。
A.1. GCC 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 与 GCC 11.2 一起发布。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
常规改进
- GCC 现在默认为 DWARF 版本 5 调试格式。
- 诊断中显示的列号默认代表实际列号,并尊重多列字符。
- 直线代码矢量器会在矢量化时考虑整个功能。
- 如果每个条件表达式都包含一个比较表达式,则可以将比较同一变量的一系列条件表达式转换为 switch 语句。
过程间优化改进:
-
新的 IPA-modref 传递,由
-fipa-modref选项控制,跟踪函数调用的副作用,并提高点分析的准确性。 -
相同的代码折叠传递,由
-fipa-icf选项控制,得到了极大改进,以增加统一功能的数量并减少编译时内存使用。
-
新的 IPA-modref 传递,由
链接时间优化改进:
- 改进了链接期间的内存分配,以减低内存使用的峰值。
-
在 IDE 中使用新的
GCC_EXTRA_DIAGNOSTIC_OUTPUT环境变量,您可以请求机器可读的"fix-it hints",而不调整构建标志。 -
通过
-fanalyzer选项运行的静态分析器得到了显著改进,提供的很多 bug 修复和增强。 为缓解 CVE-2021-42574,在 GCC 中添加了一个带有 RHSA-2021:4669 公告的发行版本的新警告。这个 new
-Wbidirectional=[none|unpaired|any]警告会警告可能危险的双向(BiDi) Unicode 字符,并有三个级别:-
-Wbidirectional=unpaired(默认)会警告不当终止的 BiDi 上下文。 -
-Wbidirectional=none关闭警告。 -
-Wbidirectional=anywarns 关于 BiDi 字符的使用。
-
特定于语言的改进
C 系列
- C 和 C++ 编译器支持 OpenMP 结构中的非矩形循环嵌套以及 OpenMP 5.0 规范的分配器例程。
属性:
-
新的
no_stack_protector属性标记不应通过堆栈保护来检测的函数(-fstack-protector)。 -
改进后的
malloc属性可用于识别分配器和解除分配器 API 对。
-
新的
新警告:
-
-Wsizeof-array-div由-Wall选项启用,当第一个运算符应用到数组,且除数不等于数组元素的大小时,会警告两个sizeof运算符的除法。 -
-Wstringop-overread(默认启用)会警告对字符串函数的调用,这些函数试图读取作为参数传递给它们的数组的末尾。
-
增强的警告:
-
-Wfree-nonheap-object使用不是从动态内存分配函数返回的指针检测更多调用取消分配函数的实例。 -
-Wmaybe-uninitialized诊断将未初始化内存的指针和引用传给接受const限定参数的函数。 -
-Wuninitialized检测来自未初始化动态分配的内存的读。
-
C
通过
-std=c2x和-std=gnu2x选项支持来自 ISO C 标准的即将推出的 C2X 修订版的几个新功能。例如:-
支持
标准属性。 -
支持
__has_c_attribute预处理器运算符。 - 标签可能会在声明之前和复合语句的末尾出现。
-
支持
C++
-
默认模式更改为
-std=gnu++17。 -
C++ 库
libstdc++现在改进了 C++17 支持。 实现了几个新的 C++20 功能。请注意,C++20 支持是实验性的。
有关功能的更多信息,请参阅 C++20 语言功能。
- C++ 前端对即将到来的 C++23 草案功能具有实验性支持。
新警告:
-
-Wctad-maybe-unsupported, 默认禁用,警告在没有推导指南的类型上执行类模板参数推理。 -
当基于范围的 for 循环创建不必要的和资源低效的副本时,由
-Wall启用的-Wrange-loop-construct将发出警告。 -
-Wmismatched-new-delete由-Wall启用,警告有关使用从不匹配的运算符形式或从其他不匹配的分配函数返回的指针对操作符删除的调用。 -
-Wvexing-parse默认启用,警告大多数 vexing 解析规则:当声明看起来像变量定义时,但 C++ 语言要求它被解释为函数声明。
-
特定于架构的改进
64 位 ARM 架构
-
Armv8-R 架构通过
-march=armv8-r选项支持。 - GCC 可自动矢量化对复杂数字执行加法、减法、乘法和累加和减法变体的操作。
AMD 和 Intel 64 位构架
- 支持以下 Intel CPU:Sapphire Rapids、Aandder Lake 和 Rocket Lake。
-
添加了对 Intel AVX-VNNI 的新 ISA 扩展支持。
-mavxvnni编译器交换机控制 AVX-VNNI 内部函数。 -
新的
-march=znver3选项支持基于 znver3 核的 AMD CPU。 -
新的
-march=x86-64-v2、-march=x86-64-v3和-march=x86-64-v4选项支持 x86-64 psABI 补充 中定义的三个微架构级别。
A.2. binutils 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 与 binutils 2.36 一起分发。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
assembler
- 在 Intel 构架上,支持 AMX、AVX VNNI、HRESET、KeySTOREr、TDX 和 UINTR 指令。
- 当设置 ELF 部分的链接顺序属性时,您可以使用数字部分索引而不是符号名称。
- 支持以下 ARM 内核: Cortex-A78、Cortex-A78AE、Cortex-A78C、Cortex-X1、Cortex-R82、Neoverse V1 和 Neoverse N2。
- 在 64 位 ARM 架构中,支持 Armv8-R 和 Armv8.7-A ISA 扩展。
-
添加了
.nop指令,它生成单个 no-operation 指令,它将在任何目标上工作。 -
支持
SHF_GNU_RETAIN标志。它指定该部分不应由链接器收集。这个标志可以使用.section指令中的R标志应用到部分。
链接器
-
添加了一个新的
libdep插件。它记录了链接静态库中的依赖关系,并在执行最终链接时使用它们。 -
添加了一个 new
-error-handling-script=<NAME> 命令行选项。当遇到未定义符号或缺失的库时,它会运行帮助程序脚本。 -
现在,链接器会去除
.ctf部分中的类型。您可以使用 new--ctf-share-types命令行选项来指定链接器如何进行此操作。此选项的默认值(共享为unconflicted)会生成最紧凑的输出。 -
默认情况下,linker 省略
.ctf部分中的 variable 部分,可节省空间。对于拥有自己的符号表的模拟的项目来说,此行为可能不适合,它们不会在 ELF 符号表中反映。 -
支持
SHF_GNU_RETAIN ELF部分。此标志指定该部分不应由链接器收集。
其他二进制工具
-
nm: 添加了一个新的命令行选项-ifunc-chars=CHARS,它指定了一个或多个字符的字符串。在显示全局ifunc符号时,第一个字符用作类型字符。显示本地ifunc符号时使用第二个字符(如果存在)。 -
ar:之前未使用的lmodifier 可以用来指定静态库的依赖项。此l选项(或其较长的 form--record-libdeps)的参数存储在存档的__.LIBDEP成员中,链接器可以在链接时读取。 -
readelf: 使用-lto-syms命令行选项,可以显示 LTO 符号表部分的内容。 -
readelf接受-C命令行选项,该选项可启用符号名解。另外,添加了-demangle=<style>,--no-demangle,--recurse选项。-limit, 和--no-recurse-limit 为缓解 CVE-2021-42574,使用 RHSA-2021:4730 公告的发行版本向 binutils 添加了一个新的命令行选项。
显示名称或字符串的工具(readelf、字符串、nm、和 objdump)
现在有一个新的-unicode(-U)命令行选项,用于控制 Unicode 字符的处理方式。可以为选项设置以下值:-
--Unicode=default将 BiDi 字符视为正常的工具。当不使用--unicode 选项时,这是默认行为。 -
--Unicode=locale 根据当前的区域设置显示 BiDi 字符。 -
--Unicode=hex将 BiDi 字符显示为十六进制字节值。 -
--Unicode=escape显示 BiDi 字符作为 Unicode 转义序列。 -
--Unicode=highlight显示 BiDi 字符,如果输出设备支持,则以红色突出显示的 Unicode 转义序列。
-
A.3. elfutils 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 带有 elfutils 0.185。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
-
eu-elflint和eu-readelf工具现在识别并显示 ELF 部分上的SHF_GNU_RETAIN和SHT_X86_64_UNWIND标志。 -
DEBUGINFOD_SONAME宏已添加到debuginfod.h。此宏可与dlopen函数一起使用,以从应用程序动态加载libdebuginfod.so库。 -
新的函数
debuginfod_set_verbose_fd已添加到debuginfod-client库。此函数通过将详细输出重定向到单独的文件来增强debuginfod_find_*查询功能。 -
设置
DEBUGINFOD_VERBOSE环境变量现在显示有关debuginfod客户端连接到哪些服务器以及这些服务器的 HTTP 响应的更多信息。 -
debuginfod服务器提供了一个新的线程繁忙指标和更详细的错误指标,以便更轻松地检查运行在debuginfod服务器上的进程。 -
libdw库透明地处理DW_FORM_indirect位置值,以便dwarf_whatform函数返回属性的实际 FORM。 -
为减少网络流量,
debuginfod-client库会在缓存中存储负结果,客户端对象可以重复使用现有连接。
A.4. dwz 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 与 dwz 0.14 一起发布。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
- 支持 DWARF 版本 5 调试格式。
-
可使用
.debug_sup部分生成 DWARF 补充对象文件。 - 添加了一个新的实验性优化,它利用 C++ 的一个定义规则。
-
支持
DW_OP_GNU_variable_value表达式 opcode。 - 修复了很多程序错误,并改进了性能。
A.5. GDB 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 使用 GDB 10.2 提供。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
新功能
- 在支持此功能的架构上默认启用了多线程符号加载。这个更改为带有许多符号的程序提供了更好的性能。
- 文本用户界面(TUI)窗口可以水平排列。
- GDB 支持同时调试多个目标连接,但这种支持是实验性的且有限的。例如,您可以将每个低端连接到运行在另一台计算机上的不同的远程服务器,或者您可以使用一个低端来调试本地原生进程或一个 core dump 或某些其他进程。
新的和改进的命令
-
新的
tui new-layout name window weight [window weight…]命令创建一个新的文本用户界面(TUI)布局,您也可以指定布局名称和显示的窗口。 -
改进的
alias [-a] [--] alias = command [default-args]命令可以在创建新别名时指定默认参数。 -
set exec-file-mismatch和show exec-file-mismatch命令集,并显示新的exec-file-mismatch选项。当 GDB 附加到正在运行的进程时,此选项控制 GDB 在检测到当前由 GDB 加载的可执行文件和用来启动进程的可执行文件不匹配时如何做出反应。
Python API
-
gdb.register_window_type函数在 Python 中实现新的 TUI 窗口。 -
现在,您可以查询动态类型。
gdb.Type类的实例可以有新的布尔属性dynamic,gdb.Type.sizeof属性对动态类型可以有值None。如果Type.fields()返回动态类型字段,则其bitpos属性的值可以是None。 -
新的
gdb.COMMAND_TUI常量将 Python 命令注册为 TUI 帮助类命令的成员。 -
新的
gdb.PendingFrame.architecture()方法检索待处理帧的架构。 -
新的
gdb.Architecture.registers方法返回gdb.RegisterDescriptorIterator对象,后者是返回gdb.RegisterDescriptor对象的迭代器。此类对象不提供寄存器的值,但帮助了解哪些寄存器可用于某一架构。 -
新的
gdb.Architecture.register_groups方法返回gdb.RegisterGroupIterator对象,后者是返回gdb.RegisterGroup对象的迭代器。此类对象帮助了解哪些寄存器组用于某一架构。
A.6. ltrace 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 带有 ltrace 0.7.91。
从以前的 Red Hat Developer Toolset 版本开始修改了以下功能:
-
如果在
$XDG_CONFIG_DIRS补丁文件中指定了路径,则不会提供诊断。
A.7. strace 的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 带有 strace 5.13。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
行为的变化
修改后的
%process类包含与进程生命周期关联的系统调用(创建、执行和终止):-
新调用:
kill,tkill,tgkill,pidfd_send_signal, 和rt_sigqueueinfo -
删除的调用:
arch_prctl和unshare
-
新调用:
改进
-
new
-n(--syscall-number)选项会打印系统调用号。 -
new-
secontext[=full]选项显示 SELinux 上下文。 -
实施 poke 注入,并添加了两个新选项
:--inject=SET:poke_enter=and-inject=SET:poke_exit=。 - 在 IBM POWER 构架中,添加了系统调用向量(SCV) ABI 支持。
-
基于
libdw的堆栈追踪为非原生个人信息启用。 - netlink 数据以更结构化的方式打印。
-
以下系统调用的解码已被实现:
close_range,epoll_pwait2,faccessat2,landlock_add_rule,landlock_create_ruleset,landlock_restrict_self,mount_setattr, 和process_madvise。 -
解码以下系统调用:
io_uring_setup,membarrier,perf_event_open, 和pidfd_open。 -
解码
GPIO swig和TEE27:2.7ioctl命令已实施。 -
实现以下
ioctl命令解码:FS_IOC_FS[GS]ETXATTR,FS_IOC_[GS]ETFLAGS, FS_IOC32_[GS]ETFLAGS ,LOOP_CONFIGURE, SIOCADDMULTI, SIOCDELMULTI ,SIOCGIFENCAP, SIOCOUTQNSD, SIOCSIFENCAP, SIOCSIFHWBROADCAST, UBI_IOCRPEB 和 UBI_IOCSPEB ,V4L2_BUF_TYPE_META_CAPTURE, V4L2_BUF_TYPE_META_OUTPUT, 和 VIDIOC_QUERY_EXT_CTRL . -
解码
PTRACE_GETREGSET和PTRACE_SETREGSETptrace请求的NT_PRSTATUS和NT_FPREGSETregsets。 -
解码以下
ptrace请求的regs参数:PTRACE_GETREGS,PTRACE_GETREGS64,PTRACE_SETREGS,PTRACE_SETREGS64,PTRACE_GETFPREGS, 和PTRACE_SETFPREGS。 -
解码
IPC_INFO和MSG_INFOmsgctl系统调用命令的struct msginfo参数。 -
解码 MSG_STAT 和
MSG_STAT_ANY参数。msgctl系统调用命令的struct msqid_ds -
解码
IPC_INFO和SEM_INFOsemctl系统调用命令的struct seminfo参数。 -
解码 IPC_
SET、、SEM_STAT 和IPC_STATsemctl 系统调用命令的SEM_STAT_ANYstruct semid_ds参数。 -
解码
IPC_INFOshmctl系统调用的struct shminfo参数。 -
解码
SHM_INFOshmctl系统调用命令的struct shm_info参数。 -
解码 SHM_STAT 和
SHM_STAT_ANY参数。shmctl系统调用命令的struct shmid_ds -
解码
IFLA_BRPORT swignetlink 属性已更新,以匹配 Linux 5.12 内核。 -
以下常量列表已更新
:*_MAGIC, ALGRAM ,AUDITfluentd ,BPF27:2.7 ,BTRFSfluentd ,CAP27:2.7 ,CLOSE_RANGEOVMF ,DEVCONFBurst ,ETHmasters ,FANHW ,IFLAvmcore , INET_DIAG lb ,INET_DIAG(2),IORING JavaDoc, IPV6 observability,IP 大会, KEXEC fluentd, KEYCTLSTORE,KEY27:2.7,KVMOVMF ,LOOPPROG, MDBA applications, MEMBARRIER_CMD27:2.7, MPOL JavaDoc , MSHW, MTD vmcore , NDA swig,NDA swig, NFT_MSG observabilityMSGERROVMF,NL, NTOVMF, PROVMF, PTP_PEROUT JavaDoc,PTRACEOVMF, RESOLVE applications,RTAX swig,RTA 7.9, RTCeffort,RTM vmcore , RTNH vmcore, RTPROT://<, RTPROTish,SCTP, SEGVswig, SO大会, STATXsatisfy, ST来查看, SYS swig, TCAsolutions, TRAPplatforms ,UFFDIO swig,UFFD solutions, 和 V4L2 vmcore . -
ioctl命令列表已更新,以匹配 Linux 5.13 内核更新中的此类列表。 随着 RHEA-2022:4635 公告的发布,strace 现在可以显示实际 SELinux 上下文和从 SELinux 上下文数据库提取的定义之间的不匹配。
strace 的 existing-
secontext选项已使用mismatch参数进行了扩展。这个参数可让您只打印预期的上下文以及实际不匹配的上下文。输出用双感叹号(!!)分隔,第一个是实际上下文,然后是预期上下文。在下面的示例中,full,mismatch参数打印预期的完整上下文以及实际的上下文,因为上下文的用户部分不匹配。但是,在使用单独的mismatch时,它只检查上下文的类型部分。预期的上下文不会打印,因为上下文的类型部分匹配。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux 上下文不匹配通常会导致与 SELinux 相关的访问控制问题。系统调用 traces 中打印的不匹配可显著加快 SELinux 上下文正确性的检查。系统调用 traces 也可以解释有关访问控制检查的特定内核行为。
程序错误修复
-
修复了
SIOCGIFINDEX、SIOCBRADDIF和SIOCBRDELIFioctl命令解码。 -
clock_gettime64,clock_settime64,clock_adjtime64, 和lock_getres_time64系统调用被添加到%clocktrace 类中。 -
statx系统调用添加到%fstat跟踪类中。 -
在以前的版本中,strace 对网络接口名称打印使用不足的缓冲区大小。这会导致断言打印需要 quoting 的接口名称,例如,名称在
xx模式下超过 4 个字符。随着 RHEA-2022:4635 公告的发布,这个程序错误已被解决。
A.8. SystemTap 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 与 SystemTap 4.5 一起发布。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
-
32 位浮点变量自动扩大到双变量,因此可作为
$context变量直接访问。 -
enum值可以作为$context变量访问。 -
BPF uconversions tapset 已扩展,并包含更多 tapset 函数,以访问用户空间中的值,如
user_long_error()。 - 并发控制得到了显著改进,以对大型服务器提供稳定的操作。
有关显著变化的更多信息,请参阅上游 SystemTap 4.5 发行注记。
A.9. Valgrind 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 带有 Valgrind 3.17.0。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
- Valgrind 可以读取 DWARF 版本 5 调试格式。
-
Valgrind 支持对
debuginfod服务器的调试查询。 - ARMv8.2 处理器指令被部分支持。
- POWER10 处理器上的 Power ISA v.3.1 指令被部分支持。
- 支持 IBM z14 处理器指令。
-
大多数 IBM z15 指令都受到支持。Valgrind 工具套件支持 IBM z15 处理器的杂项指令扩展功能 3 和向量增强功能 2。因此,Valgrind 运行使用 GCC
-march=z15编译的程序,并提供改进的性能和调试体验。 -
--track-fds=yes option尊重-q(--quiet),并默认忽略标准的文件描述符stdin、stdout和stderr。要跟踪标准的文件描述符,请使用--track-fds=all选项。 -
DHAT 工具有两种新的操作模式:
--mode=copy和--mode=ad-hoc。
A.10. Dyninst 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 使用 Dyninst 11.0.0 发布。
从以前的 Red Hat Developer Toolset 11.0 版本开始添加了以下功能:
-
支持
debuginfod服务器以及获取单独的debuginfo文件。 - 改进了对过程链接表(PLT)存根的间接调用的检测。
- 改进了 C++ 名称解译。
- 修复了代码发送过程中的内存泄漏。
A.11. Annobin 中的更改 复制链接链接已复制到粘贴板!
Red Hat Developer Toolset 11.0 带有 Annobin 9.82。
从以前的 Red Hat Developer Toolset 版本开始添加了或修改了以下功能:
GCC 插件
- 支持 ARM 和 RISCV 目标。
- 支持 LTO 编译器。
annocheck
- 在详细模式中,报告跳过特定测试的原因。
- 某些消息以颜色突出显示。
- 添加了一些 GO 测试。
- 在 64 位 ARM 架构中,添加了 BTI 和 PAC 安全功能的测试。
- 为缓解 CVE-2021-42574,添加了一个新的测试来检测符号名称中是否存在多字节字符。此更改已在 Annobin 中实现,以及 RHSA-2021:4729 公告的发布。