用户指南


Red Hat Developer Toolset 9.1

安装和使用 Red Hat Developer Toolset

Zuzana Zoubková

Red Hat Customer Content Services

Olga Tikhomirova

Red Hat Customer Content Services

Supriya Takkhi

Red Hat Customer Content Services

Jaromír Hradílek

Red Hat Customer Content Services

Matt Newsome

Red Hat Software Engineering

Robert Krátký

Red Hat Customer Content Services

Vladimír Slávik

Red Hat Customer Content Services

摘要

Red Hat Developer Toolset 是 Red Hat Enterprise Linux 平台上的开发人员提供的红帽产品。Red Hat Developer Toolset 用户指南 提供了此产品的概述,解释了如何调用和使用工具的 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 内容一起提供,特别是 ServerWorkstationhttps://access.redhat.com/downloads https://access.redhat.com/downloads请注意,需要 Optional 频道的软件包(在 第 1.5.3 节 “安装可选软件包” 中讨论)无法从 ISO 镜像安装。

Expand
表 1.1. Red Hat Developer Toolset 组件
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 中提供的两个重要方面提供了技术预览版本:

  1. Red Hat Developer Toolset 可以在 Red Hat Enterprise Linux 的多个主版本和次版本中使用,如 第 1.3 节 “兼容性” 所述。
  2. 与早期 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++ 兼容性”

Expand
表 1.2. Red Hat Developer Toolset 9.1 兼容性
 Runs on Red Hat Enterprise Linux 7.5Runs on Red Hat Enterprise Linux 7.6Runs 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),然后启用该存储库:

  1. 确定提供 Red Hat Software Collections (因此 Red Hat Developer Toolset)的订阅池 ID。要做到这一点,显示可用于您的系统的所有订阅列表:

    # subscription-manager list --available
    Copy to Clipboard Toggle word wrap

    对于每个可用的订阅,这个命令会显示其名称、唯一标识符、到期日期和其他与您的订阅相关的详情。池 ID 列在以 池 ID 开头的行上。

    有关提供对 Red Hat Developer Toolset 访问的订阅的完整列表,请参阅 https://access.redhat.com/solutions/472793

  2. 为您的系统附加适当的订阅:

    # subscription-manager attach --pool=pool_id
    Copy to Clipboard Toggle word wrap

    使用您在上一步中确定的池 ID 替换 pool_id。要验证您的系统当前已附加的订阅列表,请随时:

    # subscription-manager list --consumed
    Copy to Clipboard Toggle word wrap
  3. 确定 Red Hat Software Collections 存储库的确切名称。检索存储库元数据,并显示可用的 Yum 存储库列表:

    # subscription-manager repos --list
    Copy to Clipboard Toggle word wrap

    软件仓库名称取决于您正在使用的 Red Hat Enterprise Linux 的特定版本,并采用以下格式:

    rhel-variant-rhscl-version-rpms
    rhel-variant-rhscl-version-debug-rpms
    rhel-variant-rhscl-version-source-rpms
    Copy to Clipboard Toggle word wrap

    此外,某些软件包(如 devtoolset-9-gcc-plugin-devel )依赖于 Optional 频道中提供的软件包。这些软件包的存储库名称使用以下格式:

    rhel-version-variant-optional-rpms
    rhel-version-variant-optional-debug-rpms
    rhel-version-variant-optional-source-rpms
    Copy to Clipboard Toggle word wrap

    对于常规存储库和可选存储库,请使用 Red Hat Enterprise Linux 系统变体(服务器或工作站 )替换 variant,并使用 Red Hat Enterprise Linux 系统 版本 (7)替换。

  4. 启用步骤 no. 3 中的存储库:

    # subscription-manager repos --enable repository
    Copy to Clipboard Toggle word wrap

    使用要启用的存储库的名称替换 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
Copy to Clipboard Toggle word wrap

这会安装所有开发、调试和性能监控工具,以及系统的其他依赖软件包。另外,您可以选择只安装所选软件包组,如 第 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” 所述。

Expand
表 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
Copy to Clipboard Toggle word wrap

使用您要安装的 meta 软件包列表替换 package_name。例如,只安装开发和调试依赖于它的软件包:

# yum install devtoolset-9-toolchain
Copy to Clipboard Toggle word wrap

另外,您可以选择安装所有可用的组件,如 第 1.5.1 节 “安装所有可用组件” 所述。

1.5.3. 安装可选软件包

Red Hat Developer Toolset 提供了很多默认未安装的可选软件包。列出系统中可用的、但未安装的所有 Red Hat Developer Toolset 软件包:

$ yum list available devtoolset-9-\*
Copy to Clipboard Toggle word wrap

安装这些可选软件包:

# yum install package_name
Copy to Clipboard Toggle word wrap

使用您要安装的软件包列表替换 package_name。例如,要安装 devtoolset-9-gdb-gdbserverdevtoolset-9-gdb-doc 软件包:

# yum install devtoolset-9-gdb-gdbserver devtoolset-9-gdb-doc
Copy to Clipboard Toggle word wrap

1.5.4. 安装调试信息

要为任何 Red Hat Developer Toolset 软件包安装调试信息,请确保已安装了 yum-utils 软件包并运行:

# debuginfo-install package_name
Copy to Clipboard Toggle word wrap

例如,要为 devtoolset-9-dwz 软件包安装调试信息:

# debuginfo-install devtoolset-9-dwz
Copy to Clipboard Toggle word wrap

请注意,为了使用这个命令,您需要使用这些软件包访问存储库。如果您的系统在 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
Copy to Clipboard Toggle word wrap

这会更新 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
Copy to Clipboard Toggle word wrap

这会从系统中删除 GNU Compiler CollectionGNU Debuggerbinutils 以及作为 Red Hat Developer Toolset 的一部分的其他软件包。

注意

Red Hat Enterprise Linux 7 的 Red Hat Developer Toolset 9.1 不再包含 libatomiclibitm 库,以上命令会尝试删除,因为系统上 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 的更多信息,请参阅以下列出的资源。

在线文档
另请参阅

部分 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...'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。

当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。要在命令行上编译目标文件,请执行以下操作:

$ scl enable devtoolset-9 'gcc -o object_file -c source_file'
Copy to Clipboard Toggle word wrap

这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,编译器会创建一个名为 的文件,其源文件带有 .o 文件扩展名。将目标文件链接在一起并创建二进制文件:

$ scl enable devtoolset-9 'gcc -o output_file object_file...'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset gcc 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时间点上使用的 gcc 版本:

$ which gcc
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 gcc 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset gcc 相匹配:

$ gcc -v
Copy to Clipboard Toggle word wrap

例 2.1. 在命令行中编译 C 程序

考虑名为 hello.c 的源文件,其内容如下:

#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("Hello, World!\n");
  return 0;
}
Copy to Clipboard Toggle word wrap

在命令行中使用 Red Hat Developer Toolset 的 gcc 编译器编译此源代码:

$ scl enable devtoolset-9 'gcc -o hello hello.c'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 hello 的新二进制文件。

2.1.3. 运行 C 程序

gcc 编译程序时,它会创建一个可执行的二进制文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:

$ ./file_name
Copy to Clipboard Toggle word wrap

例 2.2. 在命令行中运行 C 程序

假设您已成功编译了 hello 二进制文件,如 例 2.1 “在命令行中编译 C 程序” 所示,您可以通过在 shell 提示符后输入以下内容来运行该文件:

$ ./hello
Hello, World!
Copy to Clipboard Toggle word wrap

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

这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,g++ 编译器默认创建名为 a.out 的文件。

当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:

$ scl enable devtoolset-9 'g++ -o object_file -c source_file'
Copy to Clipboard Toggle word wrap

这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,g++ 编译器将使用 .o 文件扩展名创建以源文件命名的文件。将目标文件链接在一起并创建二进制文件:

$ scl enable devtoolset-9 'g++ -o output_file object_file...'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset g++ 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候使用的 g++ 版本:

$ which g++
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 g++ 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset g++ 的版本号匹配:

$ g++ -v
Copy to Clipboard Toggle word wrap

例 2.3. 在命令行中编译 C++ 程序

考虑一个名为 hello.cpp 的源文件,其内容如下:

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
  cout << "Hello, World!" << endl;
  return 0;
}
Copy to Clipboard Toggle word wrap

在命令行中使用 Red Hat Developer Toolset 中的 g++ 编译器编译此源代码:

$ scl enable devtoolset-9 'g++ -o hello hello.cpp'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 hello 的新二进制文件。

2.2.3. 运行 C++ 程序

g++ 编译程序时,它会创建一个可执行文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:

$ ./file_name
Copy to Clipboard Toggle word wrap

例 2.4. 在命令行中运行 C++ 程序

假设您已成功编译了 hello 二进制文件,如 例 2.3 “在命令行中编译 C++ 程序” 所示,您可以运行它:

$ ./hello
Hello, World!
Copy to Clipboard Toggle word wrap

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

这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。

当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:

$ scl enable devtoolset-9 'gfortran -o object_file -c source_file'
Copy to Clipboard Toggle word wrap

这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,编译器会创建一个名为 的文件,其源文件带有 .o 文件扩展名。将目标文件链接在一起并创建二进制文件:

$ scl enable devtoolset-9 'gfortran -o output_file object_file...'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset gfortran 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候正在使用的 gfortran 版本:

$ which gfortran
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 gfortran 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset gfortran 的版本号匹配:

$ gfortran -v
Copy to Clipboard Toggle word wrap

例 2.5. 在命令行中编译 Fortran 程序

考虑名为 hello.f 的源文件,其内容如下:

program hello
  print *, "Hello, World!"
end program hello
Copy to Clipboard Toggle word wrap

使用 Red Hat Developer Toolset 中的 gfortran 编译器在命令行中编译此源代码:

$ scl enable devtoolset-9 'gfortran -o hello hello.f'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 hello 的新二进制文件。

2.3.3. 运行 Fortran 程序

gfortran 编译程序时,它会创建一个可执行的二进制文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:

$ ./file_name
Copy to Clipboard Toggle word wrap

例 2.6. 在命令行中运行 Fortran 程序

假设您已成功编译了 hello 二进制文件,如 例 2.5 “在命令行中编译 Fortran 程序” 所示,您可以运行它:

$ ./hello
 Hello, World!
Copy to Clipboard Toggle word wrap

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

以这种方式使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:

$ scl enable devtoolset-9 'gcc objfile.o -lsomelib'
Copy to Clipboard Toggle word wrap

请注意,这个建议也适用于使用 GCC 的基本 Red Hat Enterprise Linux 版本。

2.5. 其它资源

有关 GNU Compiler Collections 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • GCC (1)- gcc编译器的手册页提供了有关其用法的详细信息;一些例外,g++ 接受与 gcc 相同的命令行选项。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man gcc'
    Copy to Clipboard Toggle word wrap
  • gfortran(1)- gfortran 编译器的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man gfortran'
    Copy to Clipboard Toggle word wrap
  • C++ 标准库文档 - 可以选择安装 C++ 标准库的文档:

    # yum install devtoolset-9-libstdc++-docs
    Copy to Clipboard Toggle word wrap

    安装后,HTML 文档位于 /opt/rh/devtoolset-9/root/usr/share/doc/devtoolset-9-libstdC++-docs-9.3.1/html/index.html

在线文档
另请参阅

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

此命令利用为多种编程语言定义的隐式规则,包括 C、C++ 和 Fortran。结果是在当前工作目录中名为 source_file_without_extension 的二进制文件。

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您使用 Red Hat Developer Toolset make 运行 shell 会话作为默认值:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候正在使用的版本:

$ which make
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset make 的版本号匹配:

$ make -v
Copy to Clipboard Toggle word wrap

例 3.1. 使用 make 构建 C 程序

考虑名为 hello.c 的源文件,其内容如下:

#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("Hello, World!\n");
  return 0;
}
Copy to Clipboard Toggle word wrap

使用来自 Red Hat Developer Toolset 的 make 工具定义的隐式规则构建此源代码:

$ scl enable devtoolset-9 'make hello'
cc     hello.c   -o hello
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 hello 的新二进制文件。

3.3. 使用 Makefile

要构建由多个源文件组成的复杂程序,请利用 名为 Makefile 的配置文件,该文件控制如何编译程序的组件并构建最终可执行文件。Makefile 也可以包含清理工作目录、安装和卸载程序文件以及其他操作的说明。

make 自动使用当前目录中名为 GNUmakefilemakefileMakefile 的文件。要指定另一个文件名,请使用 the -f 选项:

$ make -f make_file
Copy to Clipboard Toggle word wrap

描述 Makefile 语法的详细信息超出了本指南的范围。请参阅 GNU make,上游 GNU make manual,它提供 GNU make 实用程序、Makefile 语法及其用法的深入描述。

作为安装的一部分,也可以以 Texinfo 格式提供完整的 make 手册。查看这个手册:

$ scl enable devtoolset-9 'info make'
Copy to Clipboard Toggle word wrap

例 3.2. 使用 Makefile 构建 C 程序

考虑以下名为 Makefile 的通用 Makefile,用于构建 例 3.1 “使用 make 构建 C 程序” 中引入的简单 C 程序。Makefile 定义一些变量并指定四个 规则,它们由 目标 及其 方法 组成。请注意,配有方法的行必须以 TAB 字符开头:

CC=gcc
CFLAGS=-c -Wall
SOURCE=hello.c
OBJ=$(SOURCE:.c=.o)
EXE=hello

all: $(SOURCE) $(EXE)

$(EXE): $(OBJ)
        $(CC) $(OBJ) -o $@

.o: .c
        $(CC) $(CFLAGS) $< -o $@

clean:
        rm -rf $(OBJ) $(EXE)
Copy to Clipboard Toggle word wrap

要使用此 Makefile 构建 hello.c 程序,请运行 make 工具:

$ scl enable devtoolset-9 'make'
gcc -c -Wall hello.c -o hello.o
gcc hello.o -o hello
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个新的对象文件 hello.o 和一个名为 hello 的新二进制文件。

要清理工作目录,请运行:

$ scl enable devtoolset-9 'make clean'
rm -rf hello.o hello
Copy to Clipboard Toggle word wrap

这会从工作目录中删除对象和二进制文件。

3.4. 其它资源

有关 GNU make 工具及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • make(1)- make 工具的手册页提供了有关其使用情况的信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man make'
    Copy to Clipboard Toggle word wrap
  • Texinfo 格式也提供了完整的 make 手册(包括 Makefile 语法的详细信息)。显示 Red Hat Developer Toolset 中包含的版本的信息手册:

    $ scl enable devtoolset-9 'info make'
    Copy to Clipboard Toggle word wrap
在线文档
  • GNU make - 上游 GNU make manual 提供了对 GNU make 实用程序、Makefile 语法及其用法的深入描述。
另请参阅

第 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 版本更新,并提供程序错误修正和增强。

Expand
表 4.1. Red Hat Developer Toolset 的 binutils 中包含的工具
Name描述

addr2line

将地址转换为文件名和行号。

ar

创建、修改和提取存档中的文件。

as

GNU assembler。

c++filt

解码 mangled C++ 符号。

dwp

将 DWARF 对象文件合并到单个 DWARF 软件包文件中。

elfedit

检查并编辑 ELF 文件。

gprof

显示性能分析信息。

ld

GNU 链接器。

ld.bfd

GNU 链接器的替代选择。

ld.gold

GNU 链接器的另一种替代方案。

nm

列出对象文件中的符号。

objcopy

复制和转换对象文件。

objdump

显示目标文件的信息。

ranlib

为存档内容生成索引,以便更快地访问此存档。

readelf

显示 ELF 文件的信息。

size

列出对象或存档文件的部分大小。

strings

显示文件中可打印的字符序列。

strip

丢弃对象文件中的所有符号。

4.1. 安装 binutils

在 Red Hat Developer Toolset 中,binutilsdevtoolset-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'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 object_file 的对象文件。

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

在任何时间点上验证使用的版本:

$ which as
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 作为 可执行路径将以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset 的版本号匹配,如下所示

$ as -v
Copy to Clipboard Toggle word wrap

4.3. 使用 GNU Linker

要从目标文件创建可执行二进制文件或库,请运行 ld 工具,如下所示:

$ scl enable devtoolset-9 'ld option ... -o output_file object_file ...'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,则编译器默认创建名为 a.out 的文件。

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset ld 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候使用的 ld 版本:

$ which ld
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset ld 的版本号匹配:

$ ld -v
Copy to Clipboard Toggle word wrap

4.4. 使用其他 Binary 工具

binutils 提供了除 linker 和 assembler 以外的许多二进制工具。有关这些工具的完整列表,请参阅 表 4.1 “Red Hat Developer Toolset 的 binutils 中包含的工具”

执行属于 binutils 的任何工具:

$ scl enable devtoolset-9 'tool option ... file_name'
Copy to Clipboard Toggle word wrap

有关使用 binutils 发布的工具列表,请参阅 表 4.1 “Red Hat Developer Toolset 的 binutils 中包含的工具”。例如,使用 objdump 工具检查对象文件:

$ scl enable devtoolset-9 'objdump option ... object_file'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 二进制工具运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任意时间点上使用的 binutils 版本:

$ which objdump
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 objdump 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset objdump 的版本号匹配:

$ objdump -v
Copy to Clipboard Toggle word wrap

库的静态链接

某些最新的库功能被静态链接到使用 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'
Copy to Clipboard Toggle word wrap

以这种方式使用 Red Hat Developer Toolset 中的库会导致 linker 错误消息 undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:

$ scl enable devtoolset-9 'ld objfile.o -lsomelib'
Copy to Clipboard Toggle word wrap

请注意,这个建议也适用于使用 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'
    Copy to Clipboard Toggle word wrap
在线文档
  • binutils - binutils 文档提供了二进制工具及其用法的深入描述。
另请参阅

第 5 章 elfutils

elfutils 是各种二进制工具的集合,如 eu-objdumpeu-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 包括了,并提供一些程序错误修复和增强。

Expand
表 5.1. Red Hat Developer Toolset 的 elfutils 中包含的工具
Name描述

eu-addr2line

将地址转换为文件名和行号。

eu-ar

创建、修改和提取存档中的文件。

eu-elfcmp

比较两个 ELF 文件的相关部分是否相等。

eu-elflint

验证 ELF 文件是否符合 通用 ABI (gABI ) 和特定于处理器的补充 ABI (psABI )规范。

eu-findtextrel

在文件中查找文本重新定位的来源。

eu-make-debug-archive

创建离线归档以进行调试。

eu-nm

列出对象文件中的符号。

eu-objdump

显示目标文件的信息。

eu-ranlib

为存档内容生成索引,以便更快地访问此存档。

eu-readelf

显示 ELF 文件的信息。

eu-size

列出对象或存档文件的部分大小。

eu-stack

用于取消插入进程和内核的新实用程序。

eu-strings

显示文件中可打印的字符序列。

eu-strip

丢弃对象文件中的所有符号。

eu-unstrip

使用单独的符号和调试信息合并剥离的文件。

5.1. 安装 elfutils

在 Red Hat Developer Toolset 中,elfutilsdevtoolset-9-elfutils 软件包提供,并使用 devtoolset-9-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

5.2. 使用 elfutils

要执行属于 elfutils 的任何工具,请运行以下工具:

$ scl enable devtoolset-9 'tool option ... file_name'
Copy to Clipboard Toggle word wrap

有关 elfutils 发布的工具列表,请参阅 表 5.1 “Red Hat Developer Toolset 的 elfutils 中包含的工具”。例如,使用 eu-objdump 工具检查对象文件:

$ scl enable devtoolset-9 'eu-objdump option ... object_file'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 二进制工具运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时间点上使用的 elfutils 版本:

$ which eu-objdump
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 eu-objdump 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号与 Red Hat Developer Toolset eu-objdump 的版本号匹配:

$ eu-objdump -V
Copy to Clipboard Toggle word wrap

5.3. 其它资源

有关 elfutils 的更多信息,请参阅以下列出的资源。

另请参阅

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

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset dwz 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候正在使用的 dwz 版本:

$ which dwz
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 dwz 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset dwz 的版本号匹配:

$ dwz -v
Copy to Clipboard Toggle word wrap

6.3. 其它资源

有关 dwz 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • dwz(1)- dwz 工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man dwz'
    Copy to Clipboard Toggle word wrap
另请参阅

第 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 插件

要将选项传递给带有 gccannobin 插件,请使用:

$ scl enable devtoolset-9 'gcc -fplugin=annobin -fplugin-arg-annobin-option file-name'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候使用的 annobin 版本:

$ which annobin
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 annobin 可执行路径以 /opt 开头。

7.3. 使用 Annocheck

使用 annocheck 程序扫描文件、目录或 RPM 软件包:

$ scl enable devtoolset-9 'annocheck file-name'
Copy to Clipboard Toggle word wrap
注意

annocheck 仅查找 ELF 文件。其他文件类型将被忽略。

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证在任意时间点上使用的 annocheck 版本:

$ which annocheck
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 annocheck 可执行路径将以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset annocheck 的版本号匹配:

$ annocheck --version
Copy to Clipboard Toggle word wrap

7.4. 其它资源

有关 annocheckannobin 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • annocheck(1)- annocheck 工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man annocheck'
    Copy to Clipboard Toggle word wrap
  • annobin(1)- annobin 工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man annobin'
    Copy to Clipboard Toggle word wrap

部分 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 Debuggerdevtoolset-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...'
Copy to Clipboard Toggle word wrap

同样,使用调试信息编译 C++ 程序:

$ scl enable devtoolset-9 'g++ -g -o output_file input_file...'
Copy to Clipboard Toggle word wrap

例 8.1. 使用调试信息编译 C 程序

考虑名为 fibonacci.c 的源文件,其内容如下:

#include <stdio.h>
#include <limits.h>

int main (int argc, char *argv[]) {
  unsigned long int a = 0;
  unsigned long int b = 1;
  unsigned long int sum;

  while (b < LONG_MAX) {
    printf("%ld ", b);
    sum = a + b;
    a = b;
    b = sum;
  }

  return 0;
}
Copy to Clipboard Toggle word wrap

使用来自 Red Hat Developer Toolset 的 GCC 以及 GNU Debugger 的调试信息,在命令行中编译该程序:

$ scl enable devtoolset-9 'gcc -g -o fibonacci fibonacci.c'
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 fibonacci 的新二进制文件。

为现有软件包安装调试信息

要为系统中已安装的软件包安装调试信息:

# debuginfo-install package_name
Copy to Clipboard Toggle word wrap

请注意,必须安装 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
...
Copy to Clipboard Toggle word wrap

8.3. 运行 GNU Debugger

要在您要调试的程序上运行 GNU Debugger

$ scl enable devtoolset-9 'gdb file_name'
Copy to Clipboard Toggle word wrap

这会在交互模式中启动 gdb debugger,并显示默认提示 (gdb)。要退出调试会话并返回到 shell 提示符,请随时运行以下命令:

(gdb) quit
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您使用 Red Hat Developer Toolset gdb 作为默认运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时间点上使用的 gdb 版本:

$ which gdb
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 gdb 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset gdb 的版本号匹配:

$ gdb -v
Copy to Clipboard Toggle word wrap

例 8.3. 在 fibonacci Binary 文件中运行 gdb 实用程序

这个示例假设您已成功编译了 fibonacci 二进制文件,如 例 8.1 “使用调试信息编译 C 程序” 所示。

使用 gdb 开始调试 fibonacci

$ scl enable devtoolset-9 'gdb fibonacci'
GNU gdb (GDB) Red Hat Enterprise Linux 8.2-2.el7
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from fibonacci...done.
(gdb)
Copy to Clipboard Toggle word wrap

8.4. 列出源代码

查看您要调试的程序的源代码:

(gdb) list
Copy to Clipboard Toggle word wrap

在开始执行您要调试的程序之前,GDB 会显示源代码的前 10 行,最后使用这个命令的任何后续使用都会列出另一个 10 行。开始执行后,GDB 会显示与执行停止的行相关的行,通常是当您设置断点时。

您还可以显示与特定行周周围的代码:

(gdb) list file_name:line_number
Copy to Clipboard Toggle word wrap

同样,要显示与特定功能开头的代码:

(gdb) list file_name:function_name
Copy to Clipboard Toggle word wrap

请注意,您可以更改 list 命令显示的行数:

(gdb) set listsize number
Copy to Clipboard Toggle word wrap

例 8.4. 列出 fibonacci Binary 文件的源代码

例 8.1 “使用调试信息编译 C 程序” 中列出的 fibonacci.c 文件有 17 行。假设已使用调试信息编译了它,并且希望 gdb 实用程序能够列出整个源代码,您可以运行以下命令来将列出的行数更改为 20:

(gdb) set listsize 20
Copy to Clipboard Toggle word wrap

现在,您可以通过运行不带额外参数的 list 命令来显示您要调试的文件的完整源代码:

(gdb) list
1       #include <stdio.h>
2       #include <limits.h>
3
4       int main (int argc, char *argv[]) {
5         unsigned long int a = 0;
6         unsigned long int b = 1;
7         unsigned long int sum;
8
9         while (b < LONG_MAX) {
10          printf("%ld ", b);
11          sum = a + b;
12          a = b;
13          b = sum;
14        }
15
16        return 0;
17      }
Copy to Clipboard Toggle word wrap

8.5. 设置 Breakpoints

设置新的明细点

在特定行中设置一个新的断点:

(gdb) break file_name:line_number
Copy to Clipboard Toggle word wrap

您还可以在特定功能上设置断点:

(gdb) break file_name:function_name
Copy to Clipboard Toggle word wrap

例 8.5. 设置新的明细点

这个示例假设您已使用调试信息编译了 例 8.1 “使用调试信息编译 C 程序” 中列出的 fibonacci.c 文件。

在第 10 行设置一个新的断点:

(gdb) break 10
Breakpoint 1 at 0x4004e5: file fibonacci.c, line 10.
Copy to Clipboard Toggle word wrap
列出断点

显示当前设定断点列表:

(gdb) info breakpoints
Copy to Clipboard Toggle word wrap

例 8.6. 列出断点

这个示例假设您遵循了 例 8.5 “设置新的明细点” 中的说明。

显示当前设置断点列表:

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004e5 in main at fibonacci.c:10
Copy to Clipboard Toggle word wrap
删除现有断点

删除在特定行设置的断点:

(gdb) clear line_number
Copy to Clipboard Toggle word wrap

同样,要删除在特定功能中设置的断点:

(gdb) clear function_name
Copy to Clipboard Toggle word wrap

例 8.7. 删除现有的 Breakpoint

这个示例假设您已使用调试信息编译了 例 8.1 “使用调试信息编译 C 程序” 中列出的 fibonacci.c 文件。

在第 7 行设置一个新的断点:

(gdb) break 7
Breakpoint 2 at 0x4004e3: file fibonacci.c, line 7.
Copy to Clipboard Toggle word wrap

删除这个断点:

(gdb) clear 7
Deleted breakpoint 2
Copy to Clipboard Toggle word wrap

8.6. 启动执行

要开始执行调试的程序:

(gdb) run
Copy to Clipboard Toggle word wrap

如果程序接受任何命令行参数,您可以将它们作为参数提供给 run 命令:

(gdb) run argument
Copy to Clipboard Toggle word wrap

当达到第一个断点(若有)时,执行将停止,当发生错误或程序终止时。

例 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);
Copy to Clipboard Toggle word wrap

8.7. 显示当前值

gdb 工具允许您显示与程序相关的几乎任何值,从任何复杂性到有效表达式甚至库函数的变量。但是,最常见的任务是显示变量的值。

显示特定变量的当前值:

(gdb) print variable_name
Copy to Clipboard Toggle word wrap

例 8.9. 显示变量的当前值

这个示例假设您遵循了 例 8.8 “执行 fibonacci Binary 文件” 中的说明,并在达到第 10 行的断点后停止执行 fibonacci 二进制文件。

显示 和 b 变量的当前值:

(gdb) print a
$1 = 0
(gdb) print b
$2 = 1
Copy to Clipboard Toggle word wrap

8.8. 继续执行

要在达到断点后恢复您调试的程序的执行:

(gdb) continue
Copy to Clipboard Toggle word wrap

当达到另一个断点时,执行会再次停止。要跳过一定数量的断点(通常在调试循环时):

(gdb) continue number
Copy to Clipboard Toggle word wrap

gdb 工具还允许您在执行单行代码后停止执行:

(gdb) step
Copy to Clipboard Toggle word wrap

最后,您可以执行某些行数:

(gdb) step number
Copy to Clipboard Toggle word wrap

例 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);
Copy to Clipboard Toggle word wrap

当达到断点时,执行会停止。

执行接下来的三行代码:

(gdb) step 3
13          b = sum;
Copy to Clipboard Toggle word wrap

这可让您在分配给 b 前验证 sum 变量的当前值:

(gdb) print sum
$3 = 2
Copy to Clipboard Toggle word wrap

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 注解。
在线文档
另请参阅

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

使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:

$ scl enable devtoolset-9 'strace -p process_id'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset strace 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候使用的 strace 版本:

$ which strace
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 strace 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset strace 的版本号匹配:

$ strace -V
Copy to Clipboard Toggle word wrap

9.2.1. 将输出重定向到文件

默认情况下,strace 会打印每个系统调用的名称、参数以及返回值到标准错误输出。要将此输出重定向到文件,请使用 -o 命令行选项,后跟文件名:

$ scl enable devtoolset-9 'strace -o file_name program argument...'
Copy to Clipboard Toggle word wrap

使用文件名替换 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
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 fibonacci.log 的新纯文本文件。

9.2.2. 追踪所选系统调用

要只跟踪所选系统调用集合,请使用 the -e 命令行选项运行 strace 工具:

$ scl enable devtoolset-9 'strace -e expression program argument...'
Copy to Clipboard Toggle word wrap

使用以逗号分隔的系统调用列表替换 expression,以跟踪或 表 9.1 “-e 选项的常用值” 中列出的任何关键字。有关所有可用值的详细描述,请参阅 strace(1)手册页。

Expand
表 9.1. -e 选项的常用值
value描述

%file

接受文件名为参数的系统调用。

%process

与进程管理相关的系统调用。

%network

与网络相关的系统调用。

%signal

与信号管理相关的系统调用。

%ipc

与进程间通信相关的系统调用(IPC)。

%desc

与文件描述符相关的系统调用。

请注意,语法 表达式 是完整 形式的 trace=表达式 的简写。

例 9.2. 追踪所选系统调用

考虑 例 11.1 “使用 memstomp” 中的 员工 文件。在此可执行文件上运行 strace 工具,只跟踪 mmapmunmap 系统调用:

$ scl enable devtoolset-9 'strace -e mmap,munmap ./employee'
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f896c744000
mmap(NULL, 61239, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f896c735000
mmap(0x3146a00000, 3745960, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3146a00000
mmap(0x3146d89000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x189000) = 0x3146d89000
mmap(0x3146d8e000, 18600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3146d8e000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f896c734000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f896c733000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f896c732000
munmap(0x7f896c735000, 61239)           = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f896c743000
John,john@example.comDoe,
+++ exited with 0 +++
Copy to Clipboard Toggle word wrap

9.2.3. 显示时间戳

要为每个 trace 加上以小时、分钟和秒内精确的时间为 trace 加上前缀,请使用 the -t 命令行选项运行 strace 工具:

$ scl enable devtoolset-9 'strace -t program argument...'
Copy to Clipboard Toggle word wrap

要也显示毫秒,请提供 -t 选项两次:

$ scl enable devtoolset-9 'strace -tt program argument...'
Copy to Clipboard Toggle word wrap

要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:

$ scl enable devtoolset-9 'strace -r program argument...'
Copy to Clipboard Toggle word wrap

例 9.3. 显示时间戳

考虑名为 pwd 的可执行文件。在这个文件上运行 strace 工具,并在输出中包括时间戳:

$ scl enable devtoolset-9 'strace -tt pwd'
19:43:28.011815 execve("./pwd", ["./pwd"], [/* 36 vars */]) = 0
19:43:28.012128 brk(0)                  = 0xcd3000
19:43:28.012174 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc869cb0000
19:43:28.012427 open("/etc/ld.so.cache", O_RDONLY) = 3
19:43:28.012446 fstat(3, {st_mode=S_IFREG|0644, st_size=61239, ...}) = 0
19:43:28.012464 mmap(NULL, 61239, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc869ca1000
19:43:28.012483 close(3)                = 0
...
19:43:28.013410 +++ exited with 0 +++
Copy to Clipboard Toggle word wrap

9.2.4. 显示概述

要显示执行每个系统调用所需的时间的摘要,执行这些系统调用的次数,以及执行过程中遇到的错误数量,使用 -c 命令行选项运行 strace 工具:

$ scl enable devtoolset-9 'strace -c program argument...'
Copy to Clipboard Toggle word wrap

例 9.4. 显示概述

考虑名为 lsblk 的可执行文件。在该文件上运行 strace 工具并显示追踪概述:

$ scl enable devtoolset-9 'strace -c lsblk > /dev/null'
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 80.88    0.000055           1       106        16 open
 19.12    0.000013           0       140           munmap
  0.00    0.000000           0       148           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0       258           close
  0.00    0.000000           0        37         2 stat
...
------ ----------- ----------- --------- --------- ----------------
100.00    0.000068                  1790        35 total
Copy to Clipboard Toggle word wrap

9.2.5. 使用系统调用结果篡改

模拟系统调用返回的错误有助于识别程序中缺少错误处理。

要使程序收到特定系统调用的结果的通用错误,请使用 -e fault= 选项运行 strace 工具并提供系统调用:

$ scl enable devtoolset-9 'strace -e fault=syscall program argument...'
Copy to Clipboard Toggle word wrap

要指定错误类型或返回值,请使用 -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'
Copy to Clipboard Toggle word wrap

请注意,指定错误类型和返回值是互斥的。

例 9.5. 使用系统调用结果篡改

考虑名为 lsblk 的可执行文件。在此文件中运行 strace 工具,并使 mmap () 系统调用返回错误:

$ scl enable devtoolset-9 'strace -e fault=mmap:error=EPERM lsblk > /dev/null'
execve("/usr/bin/lsblk", ["lsblk"], 0x7fff1c0e02a0 /* 54 vars */) = 0
brk(NULL)                               = 0x55d9e8b43000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 EPERM (Operation not permitted) (INJECTED)
writev(2, [{iov_base="lsblk", iov_len=5}, {iov_base=": ", iov_len=2}, {iov_base="error while loading shared libra"..., iov_len=36}, {iov_base=": ", iov_len=2}, {iov_base="", iov_len=0}, {iov_base="", iov_len=0}, {iov_base="cannot create cache for search p"..., iov_len=35}, {iov_base=": ", iov_len=2}, {iov_base="Cannot allocate memory", iov_len=22}, {iov_base="\n", iov_len=1}], 10lsblk: error while loading shared libraries: cannot create cache for search path: Cannot allocate memory
) = 105
exit_group(127)                         = ?
+++ exited with 127 +++
Copy to Clipboard Toggle word wrap

9.3. 其它资源

有关 strace 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • strace(1)- strace 工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man strace'
    Copy to Clipboard Toggle word wrap
另请参阅

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

使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:

$ scl enable devtoolset-9 'ltrace -p process_id'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset ltrace 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候使用的 ltrace 版本:

$ which ltrace
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 ltrace 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号与 Red Hat Developer Toolset ltrace 的版本号匹配:

$ ltrace -V
Copy to Clipboard Toggle word wrap

10.2.1. 将输出重定向到文件

默认情况下,ltrace 会打印每个系统调用的名称、其参数以及返回值到标准错误输出。要将此输出重定向到文件,请使用 -o 命令行选项,后跟文件名:

$ scl enable devtoolset-9 'ltrace -o file_name program argument...'
Copy to Clipboard Toggle word wrap

使用文件名替换 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
Copy to Clipboard Toggle word wrap

这会在当前工作目录中创建一个名为 fibonacci.log 的新纯文本文件。

10.2.2. 追踪所选库调用

要只跟踪所选库调用集合,请使用 the -e 命令行选项运行 ltrace 工具:

$ scl enable devtoolset-9 'ltrace -e expression program argument...'
Copy to Clipboard Toggle word wrap

使用规则链替换 expression,用于指定要追踪的库调用。规则可以包含用来识别符号名称的模式(如 mallocfree)以及标识库 SONAME (如 libc.so)的模式。例如,要追踪对 mallocfree 功能的调用,但忽略由 libc 库完成的功能:

$ scl enable devtoolset-9 'ltrace -e malloc+free-@libc.so* program'
Copy to Clipboard Toggle word wrap

例 10.2. 追踪所选库调用

考虑 ls 命令。在此程序上运行 ltrace 工具,并只跟踪 opendirreaddirclosedir 功能调用:

$ scl enable devtoolset-9 'ltrace -e opendir+readdir+closedir ls'
ls->opendir(".")     = { 3 }
ls->readdir({ 3 })   = { 61533, "." }
ls->readdir({ 3 })   = { 131, ".." }
ls->readdir({ 3 })   = { 67185100, "BUILDROOT" }
ls->readdir({ 3 })   = { 202390772, "SOURCES" }
ls->readdir({ 3 })   = { 60249, "SPECS" }
ls->readdir({ 3 })   = { 67130110, "BUILD" }
ls->readdir({ 3 })   = { 136599168, "RPMS" }
ls->readdir({ 3 })   = { 202383274, "SRPMS" }
ls->readdir({ 3 })   = nil
ls->closedir({ 3 })  = 0
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
+++ exited (status 0) +++
Copy to Clipboard Toggle word wrap

有关可用过滤器表达式的详细描述,请参阅 ltrace(1)手册页。

10.2.3. 显示时间戳

要用几小时、分钟和秒内精确的时间为 trace 加上前缀,请使用 the -t 命令行选项运行 ltrace 工具:

$ scl enable devtoolset-9 'ltrace -t program argument...'
Copy to Clipboard Toggle word wrap

要也显示毫秒,请提供 -t 选项两次:

$ scl enable devtoolset-9 'ltrace -tt program argument...'
Copy to Clipboard Toggle word wrap

要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:

$ scl enable devtoolset-9 'ltrace -r program argument...'
Copy to Clipboard Toggle word wrap

例 10.3. 显示时间戳

考虑 pwd 命令。在此程序上运行 ltrace 工具,并在输出中包括时间戳:

$ scl enable devtoolset-9 'ltrace -tt pwd'
13:27:19.631371 __libc_start_main([ "pwd" ] <unfinished ...>
13:27:19.632240 getenv("POSIXLY_CORRECT")                        = nil
13:27:19.632520 strrchr("pwd", '/')                              = nil
13:27:19.632786 setlocale(LC_ALL, "")                            = "en_US.UTF-8"
13:27:19.633220 bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
13:27:19.633471 textdomain("coreutils")                          = "coreutils"
(...)
13:27:19.637110  exited (status 0)
Copy to Clipboard Toggle word wrap

10.2.4. 显示概述

要显示执行每个系统调用所需的时间以及执行这些系统调用的次数,请使用 the -c 命令行选项运行 ltrace 工具:

$ scl enable devtoolset-9 'ltrace -c program argument...'
Copy to Clipboard Toggle word wrap

例 10.4. 显示概述

考虑 lsblk 命令。在此程序上运行 ltrace 工具并显示追踪概述:

$ scl enable devtoolset-9 'ltrace -c lsblk > /dev/null'
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 53.60    0.261644      261644         1 __libc_start_main
  4.48    0.021848          58       374 mbrtowc
  4.41    0.021524          57       374 wcwidth
  4.39    0.021409          57       374 __ctype_get_mb_cur_max
  4.38    0.021359          57       374 iswprint
  4.06    0.019838          74       266 readdir64
  3.21    0.015652          69       224 strlen
...
------ ----------- ----------- --------- --------------------
100.00    0.488135                  3482 total
Copy to Clipboard Toggle word wrap

10.3. 其它资源

有关 ltrace 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • ltrace(1)- ltrace 工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man ltrace'
    Copy to Clipboard Toggle word wrap
在线文档
  • ltrace for RHEL 6 和 7 - Red Hat Developer Blog 中的这个文章提供了有关如何使用 ltrace 进行应用程序调试的额外深度信息(包括实际示例)。
另请参阅

第 11 章 memstomp

memstomp 是一个命令行工具,可用于在各种标准不允许此类重叠时识别带有重叠内存区域的功能调用。它截获对 表 11.1 “memstomp 检查函数调用” 中列出的库函数调用,以及每个内存重叠,它会显示一个详细的回溯追踪来帮助您调试问题。

Valgrind 类似,memstomp 工具会检查应用程序,而无需重新编译它们。但是,它比这个工具快,因此作为方便的替代工具。

Red Hat Developer Toolset 带有 memstomp 0.1.5

Expand
表 11.1. memstomp 检查函数调用
功能描述

memcpy

n 字节从一个内存区域复制到另一个内存区域,并将指针返回到第二个内存区域。

memccpy

将一个内存区域的最大 n 字节复制到另一个内存区域,并在找到特定字符时停止。如果找不到给定字符,它将指针返回到上次写入字节之后的字节;或者返回 NULL。

mempcpy

n 字节从一个内存区域复制到另一个内存区域,并在上一次写入字节后向字节返回指针。

strcpy

将字符串从一个内存区域复制到另一个内存,并将指针返回到第二个字符串。

stpcpy

将字符串从一个内存区域复制到另一个内存,并将指针返回到第二个字符串的终止 null 字节。

strncpy

将最多 n 个字符从一个字符串复制到另一个字符串,并将指针返回到第二个字符串。

stpncpy

将最多 n 个字符从一个字符串复制到另一个字符串。它会返回一个指针到第二个字符串的终止 null 字节,或者如果字符串不是 null-terminated,则指向上一次写入字节后面的字节的指针。

strcat

将一个字符串附加到另一个字符串,同时覆盖第二个字符串的终止 null 字节,并在其末尾添加一个新字符串。它将指针返回到新字符串。

strncat

将最多 n 个字符从一个字符串附加到另一个字符串,同时覆盖第二个字符串的终止 null 字节,并在其末尾添加一个新字符。它将指针返回到新字符串。

wmemcpy

memcpy()功能等效的、将 n wide 字符从一个数组复制到另一个阵列,并返回指向第二个阵列的指针。

wmempcpy

mempcpy()功能等效的、将 n wide 字符从一个数组复制到另一个阵列的字符,并返回指向上一次写入字符的字节的指针。

wcscpy

strcpy() 函数的广泛字符等效,它将一个数组中的广泛字符串复制到另一个数组,并将指针返回到第二个数组。

wcsncpy

与最广泛字符() 功能等效的功能,它将一个数组中最多 n wide 字符复制到另一个数组,并将指针返回到第二个字符串。

wcscat

strcat()功能等效的、将一个 wide-character 字符串附加到另一个字符的字符,同时覆盖第二个字符串的终止 null 字节,并在其末尾添加一个新字节。它将指针返回到新字符串。

wcsncat

最大型字符等效于一个数组中最多的 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...'
Copy to Clipboard Toggle word wrap

要在检测到问题时立即终止分析的程序,请使用 - kill (或用于短)命令行选项运行该工具:

$ scl enable devtoolset-9 'memstomp --kill program argument...'
Copy to Clipboard Toggle word wrap

当您分析多线程程序时,尤其建议使用- kill 选项; backtraces 的内部实现不是线程安全,并在没有此命令行选项的情况下在多线程程序上运行 memstomp 工具。

另外,如果您使用调试信息编译分析的程序,或者可以使用这个调试信息,您可以使用 --debug-info (或 )命令行选项生成更详细的回溯追踪:

$ scl enable devtoolset-9 'memstomp --debug-info program argument...'
Copy to Clipboard Toggle word wrap

有关如何使用二进制文件中构建的调试信息编译程序的详细信息,请参阅 第 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'
Copy to Clipboard Toggle word wrap

例 11.1. 使用 memstomp

在当前工作目录中,创建名为 employee.c 的源文件,其内容如下:

#include <stdio.h>
#include <string.h>

#define BUFSIZE 80

int main(int argc, char *argv[]) {
  char employee[BUFSIZE] = "John,Doe,john@example.com";
  char name[BUFSIZE] = {0};
  char surname[BUFSIZE] = {0};
  char *email;
  size_t length;

  /* Extract the information: */
  memccpy(name, employee, ',', BUFSIZE);
  length = strlen(name);
  memccpy(surname, employee + length, ',', BUFSIZE);
  length += strlen(surname);
  email = employee + length;

  /* Compose the new entry: */
  strcat(employee, surname);
  strcpy(employee, name);
  strcat(employee, email);

  /* Print the result: */
  puts(employee);

  return 0;
}
Copy to Clipboard Toggle word wrap

将该程序编译成一个名为 employee 的二进制文件:

$ scl enable devtoolset-9 'gcc -rdynamic -g -o employee employee.c'
Copy to Clipboard Toggle word wrap

识别带有重叠内存区域的错误函数调用:

$ scl enable devtoolset-9 'memstomp --debug-info ./employee'
memstomp: 0.1.4 successfully initialized for process employee (pid 14887).

strcat(dest=0x7fff13afc265, src=0x7fff13afc269, bytes=21) overlap for employee(14887)
        ??:0    strcpy()
        ??:0    strcpy()
        ??:0    _Exit()
        ??:0    strcat()
        employee.c:26   main()
        ??:0    __libc_start_main()
        ??:0    _start()
John,john@example.comDoe,
Copy to Clipboard Toggle word wrap

11.3. 其它资源

有关 memstomp 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • memstomp(1)- memstomp 工具的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man memstomp'
    Copy to Clipboard Toggle word wrap
另请参阅
  • 第 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 可以监控各种类型的事件,如内核或应用程序、计时器、追踪点、性能计数器等函数调用。一些包括的示例脚本会生成类似于 netstatpstopiostat 的输出,另一些则包括用户打印的功能调用跟踪或用于处理安全漏洞的工具。

Red Hat Developer Toolset 与 SystemTap 4.1 一起发布。此版本比之前版本的 Red Hat Developer Toolset 中包含的版本更新,并提供大量程序错误修复和增强。

Expand
表 12.1. 使用 SystemTap 分发的工具用于 Red Hat Developer Toolset
Name描述

stap

将指令探测到 C 代码,构建内核模块并将其加载到正在运行的 Linux 内核中。

stapdyn

SystemTapDyninst 后端。

staprun

从使用 stap 实用程序构建的内核模块加载、卸载、附加和分离。

stapsh

用作 SystemTap 的远程 shell。

stap-prep

确定和--下载运行 SystemTap 所需的内核信息软件包。

stap-merge

合并每个 CPU 文件。当使用 -b 命令行选项执行 stap 实用程序时,会自动执行此脚本。

stap-report

收集有关系统的重要信息,以便在 SystemTap 中报告错误。

stap-server

编译服务器,侦听来自 stap 客户端的请求。

12.1. 安装 SystemTap

在 Red Hat Developer Toolset 中,SystemTapdevtoolset-9-systemtap 软件包提供,并使用 devtoolset-9-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

要将检测放在 Linux 内核中,SystemTap 可能还需要使用调试信息安装其他软件包。要确定要安装的软件包,请运行 stap-prep 工具,如下所示:

$ scl enable devtoolset-9 'stap-prep'
Copy to Clipboard Toggle word wrap

请注意,如果您以 root 用户身份执行这个命令,工具会自动提供安装的软件包。有关如何在您的系统上安装这些软件包的更多信息,请参阅 Red Hat Enterprise Linux 7 SystemTap Beginners Guide

12.2. 使用 SystemTap

执行属于 SystemTap 的任何工具:

$ scl enable devtoolset-9 'tool option...'
Copy to Clipboard Toggle word wrap

如需与 SystemTap 一起分发的工具列表,请参阅 表 12.1 “使用 SystemTap 分发的工具用于 Red Hat Developer Toolset”。例如,要运行 stap 工具来构建检测模块:

$ scl enable devtoolset-9 'stap option... argument...'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset SystemTap 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任意时间点上使用的 SystemTap 版本:

$ which stap
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 stap 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset SystemTap 的版本号匹配:

$ stap -V
Copy to Clipboard Toggle word wrap

12.3. 其它资源

有关 SystemTap 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • stap(1)- stap 命令的手册页提供了有关其用法的详细信息,以及其他相关手册页的引用。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man stap'
    Copy to Clipboard Toggle word wrap
  • staprun(8)- staprun 命令的手册页提供了有关其用法的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man staprun'
    Copy to Clipboard Toggle word wrap
在线文档
另请参阅
  • 第 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 中包含的版本更新,并提供大量程序错误修复和增强。

Expand
表 13.1. 用于 Red Hat Developer Toolset 的 Valgrind 工具
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 中,Valgrinddevtoolset-9-valgrind 软件包提供,并使用 devtoolset-9-perftools 自动安装。

有关如何将 Red Hat Developer Toolset 和相关软件包安装到您的系统的详情请参考 第 1.5 节 “安装 Red Hat Developer Toolset”

注意

请注意,如果您使用 ValgrindGNU Debugger 结合使用,建议您使用 Red Hat Developer Toolset 中包含的 GDB 版本来确保所有功能都被完全支持。

13.2. 使用 Valgrind

要在您要配置集的程序中运行任何 Valgrind 工具:

$ scl enable devtoolset-9 'valgrind --tool=tool program argument...'
Copy to Clipboard Toggle word wrap

有关 Valgrind 发布的工具列表,请参阅 表 13.1 “用于 Red Hat Developer Toolset 的 Valgrind 工具”。小写时必须指定-- tool 命令行选项的参数,如果忽略这个选项,则 Valgrind 默认使用 Memcheck。例如,要在程序上运行 Cachegrind,以识别缓存未命中的来源:

$ scl enable devtoolset-9 'valgrind --tool=cachegrind program argument...'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset Valgrind 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时间点上使用的 Valgrind 版本:

$ which valgrind
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 valgrind 可执行路径以 /opt 开头。或者,您可以使用以下命令确认版本号是否与 Red Hat Developer Toolset Valgrind 匹配:

$ valgrind --version
Copy to Clipboard Toggle word wrap

13.3. 其它资源

有关 Valgrind 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • Valgrind (1)- valgrind 工具的手册页提供了有关如何使用 Valgrind 的详细信息。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man valgrind'
    Copy to Clipboard Toggle word wrap
  • ValgrindValgrind Documentation - HTML 文档位于 /opt/rh/devtoolset-9/root/usr/share/doc/devtoolset-9-valgrind-3.15.0/html/index.html
在线文档
另请参阅

第 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 一起发布。

Expand
表 14.1. 用于 Red Hat Developer Toolset 的 OProfile 提供的工具
Name描述

operf

使用 Linux 性能事件子系统记录单个进程或系统范围的样本。

opannotate

从性能分析数据生成注解的源文件或装配列表。

oparchive

生成包含可执行、调试和示例文件的目录。

opgprof

以与 gprof 兼容的格式生成性能分析会话摘要。

ophelp

显示可用事件列表。

opimport

将示例数据库文件从外二进制格式转换为原生格式。

opjitconv

将即时(JIT)转储文件转换为可执行文件和可链接格式(ELF)。

opreport

生成性能分析会话的镜像和符号摘要。

ocount

一个新工具,用于计算监控命令期间发生特定事件的次数。

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

有关 OProfile 分发的工具列表,请参阅 表 14.1 “用于 Red Hat Developer Toolset 的 OProfile 提供的工具”。例如,使用 ophelp 命令以 XML 格式列出可用事件:

$ scl enable devtoolset-9 'ophelp -X'
Copy to Clipboard Toggle word wrap

请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset OProfile 运行 shell 会话:

$ scl enable devtoolset-9 'bash'
Copy to Clipboard Toggle word wrap
注意

验证您在任何时候使用的 OProfile 版本:

$ which operf
Copy to Clipboard Toggle word wrap

Red Hat Developer Toolset 的 operf 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset OProfile 的版本号匹配:

# operf --version
Copy to Clipboard Toggle word wrap

14.3. 其它资源

有关 OProfile 及其功能的更多信息,请参阅以下列出的资源。

安装的文档
  • OProfile (1)- 名为 oprofile的手册页 提供了 OProfile 和可用工具的概述。显示 Red Hat Developer Toolset 中包含的版本的手册页:

    $ scl enable devtoolset-9 'man oprofile'
    Copy to Clipboard Toggle word wrap
  • 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'
    Copy to Clipboard Toggle word wrap
在线文档
另请参阅
  • 第 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
Copy to Clipboard Toggle word wrap

您还可以为这个库安装 API 文档:

# yum install devtoolset-9-dyninst-doc
Copy to Clipboard Toggle word wrap

有关 devtoolset-9-dyninst-doc 软件包中包含的文档的完整列表,请参阅 第 15.3 节 “其它资源”。有关如何在系统中安装可选软件包的详情,请参考 第 1.5 节 “安装 Red Hat Developer Toolset”

15.2. 使用 Dyninst

15.2.1. 在 SystemTap 中使用 Dyninst

要将 DyninstSystemTap 一起使用,以允许非root 用户检测用户空间可执行文件,请使用-- dyninst (or- runtime=dyninst )命令行选项运行 stap 命令。这会告知 stapSystemTap 脚本转换为使用 Dyninst 库的 C 代码,将这个 C 代码编译到共享库,然后加载共享库并运行脚本。请注意,执行此操作时,stap 命令还需要指定 -c or -x 命令行选项。

使用 Dyninst 运行时检测可执行文件:

$ scl enable devtoolset-9 "stap --dyninst -c 'command' option... argument..."
Copy to Clipboard Toggle word wrap

同样,使用 Dyninst 运行时检测用户的进程:

$ scl enable devtoolset-9 "stap --dyninst -x process_id option... argument..."
Copy to Clipboard Toggle word wrap

有关 Red Hat Developer Toolset 版本 SystemTap 的更多信息,请参阅 第 12 章 SystemTap。有关 SystemTap 及其用法的一般介绍,请参阅 Red Hat Enterprise Linux 7 的 SystemTap Beginners 指南

例 15.1. 在 SystemTap 中使用 Dyninst

考虑一个名为 exercise.C 的源文件,其内容如下:

#include <stdio.h>

void print_iteration(int value) {
  printf("Iteration number %d\n", value);
}

int main(int argc, char **argv) {
  int i;
  printf("Enter the starting number: ");
  scanf("%d", &i);
  for(; i>0; --i)
    print_iteration(i);
  return 0;
}
Copy to Clipboard Toggle word wrap

此程序提示用户输入起始号,然后计算为 1,对每个迭代调用 print_iteration () 函数,以便将数字打印到标准输出。在命令行中使用 Red Hat Developer Toolset 中的 g++ 编译器编译该程序:

$ scl enable devtoolset-9 'g++ -g -o exercise exercise.C'
Copy to Clipboard Toggle word wrap

现在考虑另一个名为 count.stp 的源文件,其内容如下:

#!/usr/bin/stap

global count = 0

probe process.function("print_iteration") {
  count++
}

probe end {
  printf("Function executed %d times.\n", count)
}
Copy to Clipboard Toggle word wrap

SystemTap 脚本打印在执行进程期间调用 print_iteration () 函数的次数。在 练习 二进制文件中运行这个脚本:

$ scl enable devtoolset-9 "stap --dyninst -c './exercise' count.stp"
Enter the starting number: 5
Iteration number 5
Iteration number 4
Iteration number 3
Iteration number 2
Iteration number 1
Function executed 5 times.
Copy to Clipboard Toggle word wrap

15.2.2. 使用 Dyninst 作为独立库

在将 Dyninst 库用作应用程序的一部分前,请将 DYNINSTAPI_RT_LIB 环境变量的值设置为运行时库文件的路径:

$ export DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-9/root/usr/lib64/dyninst/libdyninstAPI_RT.so
Copy to Clipboard Toggle word wrap

这会在当前 shell 会话中设置 DYNINSTAPI_RT_LIB 环境变量。

例 15.2 “使用 Dyninst 作为独立应用程序” 演示了如何编写和构建程序来监控用户空间进程的执行。有关如何使用 Dyninst 的详细信息,请查看 第 15.3 节 “其它资源” 中列出的资源。

例 15.2. 使用 Dyninst 作为独立应用程序

考虑 exercise.C 源文件 例 15.1 “在 SystemTap 中使用 Dyninst” :该程序提示用户输入起始号,然后计数为 1,为每个迭代调用 print_iteration () 函数,以便打印到标准输出的数字。

现在考虑另一个名为 count.C 的源文件,其内容如下:

#include <stdio.h>
#include <fcntl.h>
#include "BPatch.h"
#include "BPatch_process.h"
#include "BPatch_function.h"
#include "BPatch_Vector.h"
#include "BPatch_thread.h"
#include "BPatch_point.h"

void usage() {
  fprintf(stderr, "Usage: count <process_id> <function>\n");
}

// Global information for counter
BPatch_variableExpr *counter = NULL;

void createCounter(BPatch_process *app, BPatch_image *appImage) {
  int zero = 0;
  counter = app->malloc(*appImage->findType("int"));
  counter->writeValue(&zero);
}

bool interceptfunc(BPatch_process *app,
                   BPatch_image *appImage,
                   char *funcName) {
  BPatch_Vector<BPatch_function *> func;
  appImage->findFunction(funcName, func);
  if(func.size() == 0) {
    fprintf(stderr, "Unable to find function to instrument()\n");
    exit (-1);
  }
  BPatch_Vector<BPatch_snippet *> incCount;
  BPatch_Vector<BPatch_point *> *points;
  points = func[0]->findPoint(BPatch_entry);
  if ((*points).size() == 0) {
    exit (-1);
  }

  BPatch_arithExpr counterPlusOne(BPatch_plus, *counter, BPatch_constExpr(1));
  BPatch_arithExpr addCounter(BPatch_assign, *counter, counterPlusOne);

  return app->insertSnippet(addCounter, *points);
}

void printCount(BPatch_thread *thread, BPatch_exitType) {
  int val = 0;
  counter->readValue(&val, sizeof(int));
  fprintf(stderr, "Function executed %d times.\n", val);
}

int main(int argc, char *argv[]) {
   int pid;
   BPatch bpatch;
   if (argc != 3) {
     usage();
     exit(1);
   }
   pid = atoi(argv[1]);
   BPatch_process *app = bpatch.processAttach(NULL, pid);
   if (!app) exit (-1);
   BPatch_image *appImage = app->getImage();
   createCounter(app, appImage);
   fprintf(stderr, "Finding function %s(): ", argv[2]);
   BPatch_Vector<BPatch_function*> countFuncs;
   fprintf(stderr, "OK\nInstrumenting function %s(): ", argv[2]);
   interceptfunc(app, appImage, argv[2]);
   bpatch.registerExitCallback(printCount);
   fprintf(stderr, "OK\nWaiting for process %d to exit...\n", pid);
   app->continueExecution();
   while (!app->isTerminated())
     bpatch.waitForStatusChange();
   return 0;
}
Copy to Clipboard Toggle word wrap

请注意,在调用任何 Dyninst 库解结构器之前,客户端应用程序应该销毁所有 Bpatch 对象。否则,变异程序可能会意外终止并出现分段错误。要临时解决这个问题,请将 mutator 的 BPatch 对象设置为 main () 函数中的本地变量。或者,如果您需要使用 BPatch 作为全局变量,请在 mutator 退出前手动分离所有 mutatee 进程。

该程序接受进程 ID 和函数名称作为命令行参数,然后打印执行过程中调用函数的次数。您可以使用以下 Makefile 来构建这两个文件:

DTS      = /opt/rh/devtoolset-9/root
CXXFLAGS = -g -I$(DTS)/usr/include/dyninst
LBITS   := $(shell getconf LONG_BIT)

ifeq ($(LBITS),64)
  DYNINSTLIBS = $(DTS)/usr/lib64/dyninst
else
  DYNINSTLIBS = $(DTS)/usr/lib/dyninst
endif

.PHONY: all
all: count exercise

count: count.C
	g++ $(CXXFLAGS) count.C -I /usr/include/dyninst -c
	g++ $(CXXFLAGS) count.o -L $(DYNINSTLIBS) -ldyninstAPI -o count

exercise: exercise.C
	g++ $(CXXFLAGS) exercise.C -o exercise

.PHONY: clean
clean:
	rm -rf *~ *.o count exercise
Copy to Clipboard Toggle word wrap

要在命令行中使用 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
Copy to Clipboard Toggle word wrap

这会创建一个名为 exercise 的新二进制文件,并在当前工作目录中 计数

在一个 shell 会话中,按如下所示执行 练习 二进制文件,并等待它提示您输入起始号:

$ ./exercise
Enter the starting number:
Copy to Clipboard Toggle word wrap

不要输入这个数字。相反,启动另一个 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...
Copy to Clipboard Toggle word wrap

现在,切换回第一个 shell 会话,并根据 练习 程序的要求输入起始号。例如:

Enter the starting number: 5
Iteration number 5
Iteration number 4
Iteration number 3
Iteration number 2
Iteration number 1
Copy to Clipboard Toggle word wrap

练习 程序终止时,计数 程序会显示 print_iteration () 函数执行的次数:

Function executed 5 times.
Copy to Clipboard Toggle word wrap

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”

在线文档
另请参阅
  • 第 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 种语言转换,对于每种产品,它以 HTMLPDFEPUB 格式提供不同种类的书本,从发布和技术说明到安装、用户和参考指南。

以下是与本书直接或间接相关的简要文档列表。

Red Hat Developer Toolset

Red Hat Enterprise Linux

第 18 章 联系全球支持服务

除非有自助支持订阅,否则当红帽文档网站和客户门户网站无法提供您的问题的答案时,您还可以联系 全球支持服务 (GSS)。

18.1. 收集所需信息

在联系 GSS 之前,应收集多个信息项目。

背景信息

在调用 GSS 前,请确保您手动有以下背景信息:

  • 产品运行的硬件类型、制作和型号
  • 软件版本
  • 最新升级
  • 对系统的任何最近更改
  • 问题解释和症状
  • 有关此问题的任何消息或重要信息
注意

如果您忘记了红帽登录信息,可以在 https://access.redhat.com/site/help/LoginAssistance.html 中恢复。

诊断

还需要 Red Hat Enterprise Linux 的诊断报告。这个报告也称为 sosreport,用于创建报告的程序由 sos 软件包提供。要在您的系统中安装 sos 软件包及其所有依赖项:

# yum install sos
Copy to Clipboard Toggle word wrap

生成报告:

# sosreport
Copy to Clipboard Toggle word wrap

如需更多信息,请访问知识库文章 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. 其它资源

如需更多信息,请参阅以下列出的资源。

在线文档

附录 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 选项。
  • 校准相关的选项 -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 时,-Wpessim izing - move 选项表示,在调用 std::move 时警告。
    • 默认情况下,-Winit-list-lifetime 选项为 on。在使用 std::initializer_list 时,它会发出警告,可能会导致悬停的指针。
  • C++ 前端现在对某些 C++2a 草案功能具有实验性支持,并带有 -std=c++2a or -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。

    • 适用于所有线程的帧,包括带有错误和空输出的帧和线程。
更改的命令
  • 选择-frameinfo 帧 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 type
    info variables
    rbreak

    前面的四个命令现在根据 设置语言 选项中选择的语言来确定实体的语法。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] 命令行选项启用备用的、较短的指令编码。
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_time 64, pselect6_time 64, ppoll_time 64, io_pgetevents_time 64, recvmmsg_time 64, mq_timedsend_time 64, mq_timedreceive_time 64, semtimedop_time 64, rt_sigtimedwait_time 64, futex_ time64, sched_rr_get_interval_ time64, pidfd_send _signal, io_uring _setup, io_uring _enter , 和 io_uring _register .
  • 解码 bpf 系统调用。
  • 实施了以下 ioctl 命令解码: BLKGETZONESZ、BBLKGETNRZONESKVM_CHECK_EXTENSIONNBD HW 和 RND*
  • 实施 s socket 系统调用中的 AF_PACKET 协议的解码。
  • 解码 SOL_XDP 套接字选项名称。
  • 解码 getsockopt SO_ERRORSO_TIMESTAMP*_NEW 选项。
  • 解码 IFLA swig , NETCONFA solutions ,SMC_DIAG PPK netlink 属性会被改进。
  • IBM Z 架构上现在提供了对 pkey_mprotectpkey_allocpkey_free 系统调用解码。
  • 解码直接 IPC 系统调用现在在 IBM POWER 和 IBM Z 构架上提供。
  • 解码 kexec_file_loadrseq 系统调用现在包括在 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 的对象。

    Bug#90920

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 速度运行。

    BZ#1785447

B.3. binutils 中的更改

Red Hat Developer Toolset 9.1 与 binutils 2.32 一起发布。

自以前的 Red Hat Developer Toolset 版本以来,以下程序错误已被解决:

  • 在以前的版本中,当用户指示链接器执行垃圾回收时,链接器可能会错误地从程序中删除弱符号引用。因此,程序被视为未定义符号,即使它是由共享库提供的。在 Red Hat Developer Toolset 9.1 中,这个问题已被解决。弱引用保留在程序中,并在运行时正确解决。

    BZ#1804325

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 中,这个问题已被解决。

    BZ#1790057

  • 在以前的版本中,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 属性。

      BZ#1758201

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) " 解决了一些内部错误。

    BZ#1759532

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat