9.2. 使用 strace
要在您要分析的程序上运行 strace 工具:
scl enable devtoolset-11 'strace program argument...'
$ scl enable devtoolset-11 'strace program argument...'
使用您要分析的程序的名称替换 program,使用您要提供给该程序的任何命令行选项和参数替换 parameter。另外,您可以使用 the -p 命令行选项后跟进程 ID,在已经运行的进程上运行该工具:
scl enable devtoolset-11 'strace -p process_id'
$ scl enable devtoolset-11 'strace -p process_id'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset strace 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 'bash'
验证您在任何时候使用的 strace 版本:
which strace
$ which strace
Red Hat Developer Toolset 的 strace 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset strace 的版本号匹配:
strace -V
$ strace -V
9.2.1. 将输出重定向到文件 复制链接链接已复制到粘贴板!
默认情况下,strace 会打印每个系统调用的名称、参数以及返回值到标准错误输出。要将此输出重定向到文件,请使用 -o 命令行选项,后跟文件名:
scl enable devtoolset-11 'strace -o file_name program argument...'
$ scl enable devtoolset-11 'strace -o file_name program argument...'
使用文件名替换 file_name。
例 9.1. 将输出重定向到文件
考虑来自 例 8.1 “使用调试信息编译 C 程序” 的 fibonacci 文件稍修改的版本。此可执行文件显示 Fibonacci 序列,并可选择指定要列出此序列的成员数量。对此文件运行 strace 工具,并将 trace 输出重定向到 fibonacci.log :
scl enable devtoolset-11 'strace -o fibonacci.log ./fibonacci 20'
$ scl enable devtoolset-11 'strace -o fibonacci.log ./fibonacci 20'
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
这会在当前工作目录中创建一个名为 fibonacci.log 的新纯文本文件。
9.2.2. 追踪所选系统调用 复制链接链接已复制到粘贴板!
要只跟踪所选系统调用集合,请使用 the -e 命令行选项运行 strace 工具:
scl enable devtoolset-11 'strace -e expression program argument...'
$ scl enable devtoolset-11 'strace -e expression program argument...'
使用以逗号分隔的系统调用列表替换 expression,以跟踪或 表 9.1 “-e 选项的常用值” 中列出的任何关键字。有关所有可用值的详细描述,请参阅 strace(1)手册页。
| value | 描述 |
|---|---|
|
| 接受文件名为参数的系统调用。 |
|
| 与进程管理相关的系统调用。 |
|
| 与网络相关的系统调用。 |
|
| 与信号管理相关的系统调用。 |
|
| 与进程间通信相关的系统调用(IPC)。 |
|
| 与文件描述符相关的系统调用。 |
请注意,语法 表达式 是完整 形式的 trace=表达式 的简写。
例 9.2. 追踪所选系统调用
考虑 例 11.1 “使用 memstomp” 中的 员工 文件。在此可执行文件上运行 strace 工具,只跟踪 mmap 和 munmap 系统调用:
9.2.3. 显示时间戳 复制链接链接已复制到粘贴板!
要为每个 trace 加上以小时、分钟和秒内精确的时间为 trace 加上前缀,请使用 the -t 命令行选项运行 strace 工具:
scl enable devtoolset-11 'strace -t program argument...'
$ scl enable devtoolset-11 'strace -t program argument...'
要也显示毫秒,请提供 -t 选项两次:
scl enable devtoolset-11 'strace -tt program argument...'
$ scl enable devtoolset-11 'strace -tt program argument...'
要使用执行相应系统调用所需的时间为每行添加前缀,请使用 the -r 命令行选项:
scl enable devtoolset-11 'strace -r program argument...'
$ scl enable devtoolset-11 'strace -r program argument...'
例 9.3. 显示时间戳
考虑名为 pwd 的可执行文件。在这个文件上运行 strace 工具,并在输出中包括时间戳:
9.2.4. 显示概述 复制链接链接已复制到粘贴板!
要显示执行每个系统调用所需的时间的摘要,执行这些系统调用的次数,以及执行过程中遇到的错误数量,使用 -c 命令行选项运行 strace 工具:
scl enable devtoolset-11 'strace -c program argument...'
$ scl enable devtoolset-11 'strace -c program argument...'
例 9.4. 显示概述
考虑名为 lsblk 的可执行文件。在该文件上运行 strace 工具并显示追踪概述:
9.2.5. 使用系统调用结果篡改 复制链接链接已复制到粘贴板!
模拟系统调用返回的错误有助于识别程序中缺少错误处理。
要使程序收到特定系统调用的结果的通用错误,请使用 -e fault= 选项运行 strace 工具并提供系统调用:
scl enable devtoolset-11 'strace -e fault=syscall program argument...'
$ scl enable devtoolset-11 'strace -e fault=syscall program argument...'
要指定错误类型或返回值,请使用 -e inject= 选项:
scl enable devtoolset-11 'strace -e inject=syscall:error=error-type program argument' scl enable devtoolset-11 'strace -e inject=syscall:retval=return-value program argument'
$ scl enable devtoolset-11 'strace -e inject=syscall:error=error-type program argument'
$ scl enable devtoolset-11 'strace -e inject=syscall:retval=return-value program argument'
请注意,指定错误类型和返回值是互斥的。
例 9.5. 使用系统调用结果篡改
考虑名为 lsblk 的可执行文件。在此文件中运行 strace 工具,并使 mmap () 系统调用返回错误: