用户指南


Red Hat Developer Toolset 11.0

安装和使用 Red Hat Developer Toolset

Olga Tikhomirova

Red Hat Customer Content Services

Zuzana Zoubková

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 版本,以及到具有更深入的信息的资源的链接。

使开源包含更多

红帽致力于替换我们的代码、文档和 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 内容一起提供,特别是 ServerWorkstationhttps://access.redhat.com/downloads https://access.redhat.com/downloads请注意,需要 Optional 频道的软件包(在 第 1.5.3 节 “安装可选软件包” 中讨论)无法从 ISO 镜像安装。

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

  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 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++ 兼容性”

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

  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-11-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-11 软件包:

# yum install devtoolset-11
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-11-perftools

性能监控工具

SystemTap, Valgrind, OProfile, Dyninst

devtoolset-11-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-11-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-11-\*
Copy to Clipboard Toggle word wrap

安装这些可选软件包:

# yum install package_name
Copy to Clipboard Toggle word wrap

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

# yum install devtoolset-11-gdb-gdbserver devtoolset-11-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-11-dwz 软件包安装调试信息:

# debuginfo-install devtoolset-11-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-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
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 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
Copy to Clipboard Toggle word wrap

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

注意

Red Hat Enterprise Linux 7 的 Red Hat Developer Toolset 11.0 不再包含 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 的更多信息,请参阅以下列出的资源。

在线文档
  • 红帽订阅管理 指南集合 - 红帽订阅管理指南集合提供了有关如何管理 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 上构建和使用容器镜像的综合概述。
另请参阅

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

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11 '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-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...'
Copy to Clipboard Toggle word wrap

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11 '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 以及从 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...'
Copy to Clipboard Toggle word wrap

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11 '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-11 'gcc -lsomelib objfile.o'
Copy to Clipboard Toggle word wrap

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

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

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

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

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

在线文档
另请参阅

第 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 makedevtoolset-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'
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-11 '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-11 '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-11 '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-11 '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-11 '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-11 'man make'
    Copy to Clipboard Toggle word wrap
  • Texinfo 格式也提供了完整的 make 手册(包括 Makefile 语法的详细信息)。显示 Red Hat Developer Toolset 中包含的版本的信息手册:

    $ scl enable devtoolset-11 '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.36 一起发布。这个版本比 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-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'
Copy to Clipboard Toggle word wrap

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

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

$ scl enable devtoolset-11 '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-11 '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-11 '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-11 'tool option ... file_name'
Copy to Clipboard Toggle word wrap

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

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

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

$ scl enable devtoolset-11 '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-11 'ld -lsomelib objfile.o'
Copy to Clipboard Toggle word wrap

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

$ scl enable devtoolset-11 '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-11 '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.185。此版本比以前版本的 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-11-elfutils 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

5.2. 使用 elfutils

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

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

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

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

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

$ scl enable devtoolset-11 '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.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'
Copy to Clipboard Toggle word wrap

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

$ scl enable devtoolset-11 '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-11 '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-11-gcc 软件包提供,并如 第 1.5.3 节 “安装可选软件包” 所述安装。

7.2. 使用 Annobin 插件

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

$ scl enable devtoolset-11 '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-11 'bash'
Copy to Clipboard Toggle word wrap

7.3. 使用 Annocheck

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

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

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

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

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11 '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-11 '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-11 '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-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 注解。
在线文档
另请参阅

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-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
Copy to Clipboard Toggle word wrap

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

9.2.2. 追踪所选系统调用

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

$ scl enable devtoolset-11 '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-11 '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-11 'strace -t program argument...'
Copy to Clipboard Toggle word wrap

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

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

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

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

例 9.3. 显示时间戳

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

$ scl enable devtoolset-11 '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-11 'strace -c program argument...'
Copy to Clipboard Toggle word wrap

例 9.4. 显示概述

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

$ scl enable devtoolset-11 '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-11 'strace -e fault=syscall program argument...'
Copy to Clipboard Toggle word wrap

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11-ltrace 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

10.2. 使用 ltrace

要在您要分析的程序上运行 ltrace 工具:

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-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
Copy to Clipboard Toggle word wrap

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

10.2.2. 追踪所选库调用

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

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

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

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

例 10.2. 追踪所选库调用

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

$ scl enable devtoolset-11 '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-11 'ltrace -t program argument...'
Copy to Clipboard Toggle word wrap

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

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

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

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

例 10.3. 显示时间戳

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

$ scl enable devtoolset-11 '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-11 'ltrace -c program argument...'
Copy to Clipboard Toggle word wrap

例 10.4. 显示概述

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

$ scl enable devtoolset-11 '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-11 '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-11-memstomp 软件包提供,并使用 devtoolset-11-toolchain 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

11.2. 使用 memstomp

要在您要分析的程序中运行 memstomp 工具:

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

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

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11 'gcc -rdynamic -g -o employee employee.c'
Copy to Clipboard Toggle word wrap

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

$ scl enable devtoolset-11 '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-11 '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.5 一起发布。此版本比之前版本的 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-11-systemtap 软件包提供,并使用 devtoolset-11-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

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

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

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

12.2. 使用 SystemTap

执行属于 SystemTap 的任何工具:

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

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

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

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

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

    $ scl enable devtoolset-11 '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.17.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-11-valgrind 软件包提供,并使用 devtoolset-11-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-11 '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-11 '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-11 '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-11 'man valgrind'
    Copy to Clipboard Toggle word wrap
  • ValgrindValgrind Documentation - HTML 文档位于 /opt/rh/devtoolset-11/root/usr/share/doc/devtoolset-11-valgrind-3.17.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.4.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-11-oprofile 软件包提供,并使用 devtoolset-11-perftools 自动安装,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。

14.2. 使用 OProfile

要运行任何与 OProfile 一起分发的工具:

# scl enable devtoolset-11 'tool option...'
Copy to Clipboard Toggle word wrap

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

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

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

$ scl enable devtoolset-11 '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-11 '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-11 '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 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
Copy to Clipboard Toggle word wrap

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

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

有关 devtoolset-11-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-11 "stap --dyninst -c 'command' option... argument..."
Copy to Clipboard Toggle word wrap

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

$ scl enable devtoolset-11 "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-11 '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-11 "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-11/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-11/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-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
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-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...
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-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”

在线文档
另请参阅
  • 第 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. 版本 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 选项控制,得到了极大改进,以增加统一功能的数量并减少编译时内存使用。
  • 链接时间优化改进:

    • 改进了链接期间的内存分配,以减低内存使用的峰值。
  • 在 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=any warns 关于 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 :之前未使用的 l modifier 可以用来指定静态库的依赖项。此 l 选项(或其较长的 form --record-libdeps)的参数存储在存档的 __.LIBDEP 成员中,链接器可以在链接时读取。
  • readelf: 使用 -lto-syms 命令行选项,可以显示 LTO 符号表部分的内容。
  • readelf 接受 -C 命令行选项,该选项可启用符号名解。另外,添加了- demangle=<style&gt; ,--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-elflinteu-readelf 工具现在识别并显示 ELF 部分上的 SHF_GNU_RETAINSHT_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-mismatchshow exec-file-mismatch 命令集,并显示新的 exec-file-mismatch 选项。当 GDB 附加到正在运行的进程时,此选项控制 GDB 在检测到当前由 GDB 加载的可执行文件和用来启动进程的可执行文件不匹配时如何做出反应。
Python API
  • gdb.register_window_type 函数在 Python 中实现新的 TUI 窗口。
  • 现在,您可以查询动态类型。gdb.Type 类的实例可以有新的布尔属性 dynamicgdb.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_prctlunshare
改进
  • 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 swigTEE27:2.7 ioctl 命令已实施。
  • 实现以下 ioctl 命令解码: FS_IOC_FS[GS]ETXATTR,FS_IOC_[GS]ETFLAGS , FS_IOC32_[GS]ET FLAGS ,LOOP_CONFIG URE, SIOCADD MULTI, SIOCDEL MULTI ,SIOCGIFENCAP , SIOCOUT QNSD, SIOCSIFE NCAP, SIOCSIFHWBRO ADCAST, UBI_IOCRPEB 和 UBI_I OCSPEB ,V4L2_BUF_TYPE_META_CAPTURE , V4L2_BUF_TYPE_META _OUTPUT , 和 VIDIOC_QUERY_EXT _CTRL .
  • 解码 PTRACE_GETREGSETPTRACE_SETREGSET ptrace 请求的 NT_PRSTATUSNT_FPREGSET regsets。
  • 解码以下 ptrace 请求的 regs 参数: PTRACE_GETREGS,PTRACE_GETREGS64,PTRACE_SETREGS,PTRACE_SETREGS64,PTRACE_GETFPREGS, 和 PTRACE_SETFPREGS
  • 解码 IPC_INFOMSG_INFO msgctl 系统调用命令的 struct msginfo 参数。
  • 解码 MSG_STAT 和 MSG_STAT _ ANY msgctl 系统调用命令的 struct msqid_ ds 参数。
  • 解码 IPC_INFOSEM_INFO semctl 系统调用命令的 struct seminfo 参数。
  • 解码 IPC_ SET、IPC _STAT、SEM_STAT 和 SEM_STAT _ANY semctl 系统调用命令的 struct semid_ds 参数。
  • 解码 IPC_INFO shmctl 系统调用的 struct shminfo 参数。
  • 解码 SHM_INFO shmctl 系统调用命令的 struct shm_info 参数。
  • 解码 SHM_STAT 和 SHM_STAT _ ANY shmctl 系统调用命令的 struct shmid_ ds 参数。
  • 解码 IFLA_BRPORT swig netlink 属性已更新,以匹配 Linux 5.12 内核。
  • 以下常量列表已更新 :*_MAGIC , ALG RAM , AUDIT fluentd , BPF 27:2.7 , BTRFS fluentd , CAP 27:2.7 , CLOSE_RANGE OVMF , DEVCONF Burst , ETH masters , FAN HW , IFLA vmcore , INET_DIAG lb , INET_DIAG (2), IO RING JavaDoc , IPV 6 observability , IP 大会 , K EXEC fluentd , KEY CTLSTORE , KEY27:2.7 , KVMOVMF , LOOPPROG , MDB A applications , MEMBARRIER_ CMD27:2.7 , M POL JavaDoc , MSHW , MT D vmcore , NDA swig , NDA swig , NFT_MSG observability , NL MSGERROVMF , NTOVMF , PROVMF , PTP_ PEROUT JavaDoc , PTRACEOVMF , RES OLVE applications , RTAX swig , RTA 7.9 , RTCeffort , RTM vmcore , RTNH vmcore , RTPROT://< , RT PROTish , SCTP, SEGV swig, SO 大会, STATX satisfy, ST 来查看, SYS swig , TCA solutions, TRAP platforms , UFFDIO swig , UFFD solutions , 和 V 4L2 vmcore .
  • ioctl 命令列表已更新,以匹配 Linux 5.13 内核更新中的此类列表。
  • 随着 RHEA-2022:4635 公告的发布,strace 现在可以显示实际 SELinux 上下文和从 SELinux 上下文数据库提取的定义之间的不匹配。

    strace 的 existing- secontext 选项已使用 mismatch 参数进行了扩展。这个参数可让您只打印预期的上下文以及实际不匹配的上下文。输出用双感叹号(!!)分隔,第一个是实际上下文,然后是预期上下文。在下面的示例中,full,mismatch 参数打印预期的完整上下文以及实际的上下文,因为上下文的用户部分不匹配。但是,在使用单独的 mismatch 时,它只检查上下文的类型部分。预期的上下文不会打印,因为上下文的类型部分匹配。

    [...]
    $ strace --secontext=full,mismatch -e statx stat /home/user/file
    statx(AT_FDCWD, "/home/user/file" [system_u:object_r:user_home_t:s0!!unconfined_u:object_r:user_home_t:s0], ...
    
    $ strace --secontext=mismatch -e statx stat /home/user/file
    statx(AT_FDCWD, "/home/user/file" [user_home_t:s0], ...
    Copy to Clipboard Toggle word wrap

    SELinux 上下文不匹配通常会导致与 SELinux 相关的访问控制问题。系统调用 traces 中打印的不匹配可显著加快 SELinux 上下文正确性的检查。系统调用 traces 也可以解释有关访问控制检查的特定内核行为。

程序错误修复
  • 修复了 SIOCGIFINDEXSIOCBRADDIFSIOCBRDELIF ioctl 命令解码。
  • clock_gettime64,clock_settime64,clock_adjtime64, 和 lock_getres_time64 系统调用被添加到 %clock trace 类中。
  • 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),并默认忽略标准的文件描述符 stdinstdoutstderr。要跟踪标准的文件描述符,请使用 --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 公告的发布。

法律通告

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

© 2026 Red Hat