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
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat