Linux 中的 strace 命令及示例

strace 命令是 Linux 中一个强大的调试和诊断工具。 它记录每个系统调用和它收到的特定进程的响应。 它类似于 truss 其他类 Unix 操作系统中的工具。 因此,您可以调试程序而无需阅读其代码。 它也是学习系统调用的好工具。

系统调用就像一个接口,软件通过它向内核请求服务。

系统调用

操作系统中有很多系统调用,但了解它们超出了本文的范围。

目录

如何在 Linux 上安装 strace?

如果你没有 strace 已经在您的系统上,请使用系统的默认包管理器来安装它。

对于基于 Ubuntu/Debian 的系统,执行以下命令 易于 命令与 sudo

sudo apt install strace

对于基于 CentOS/RedHat 的系统,执行以下命令 百胜 命令:

sudo yum install strace

句法

的语法 strace 命令如下:

strace [-ACdffhikqqrtttTvVwxxyyzZ] [-I n] [-b execve] [-e expr]... [-O overhead] [-S sortby] [-U columns] [-a column] [-o file] [-s strsize] [-X format] [-P path]... [-p pid]... [--seccomp-bpf] { -p pid | [-DDD][-E var[=val]]... [-u username] command [args] }
strace -c [-dfwzZ] [-I n] [-b execve] [-e expr]... [-O overhead] [-S sortby] [-U columns] [-P path]... [-p pid]... [--seccomp-bpf] { -p pid | [-DDD] [-E var[=val]]...[-u username] command [args] }

执行一个简单的 strace

使用 strace 没有任何选项将按照程序在执行期间进行系统调用的相同顺序输出所有系统调用。

要尝试一下,让我们尝试一下 strace 命令与 curl 命令:

strace curl google.com
追踪 curl 命令

在上图中,您可以看到 strace 命令给了我们很多输出。 这些是为打印最终结果而进行的所有系统调用,如下所示。

卷曲 Google.com 输出curl google.com 输出

将 strace 的输出写入文件

执行 strace 命令与 -o 将输出写入文件,您可以稍后查看。

将输出写入文件 strace 命令 curl 命令执行:

strace -o curl.out curl google.com
将 Strace 的输出写入文件写入输出 跟踪 命令到文件

使用 strace 跟踪进程的特定系统调用

要跟踪特定的系统调用, 痕迹 表达式与 -e 中的选项 strace 命令。

用于跟踪表达式的语法 strace 命令 curl 命令执行:

strace -e trace=syscall_set curl google.com

在哪里 syscall_set 是指定的系统调用集。

仅适用于 Sockets 系统调用的 Strace 命令输出仅用于套接字系统调用的 strace 命令输出

在上图中,您可以看到,当我们指定 socket 系统调用在 strace 命令,它只打印出 socket 系统调用。

类似地,我们可以定义一组我们想要打印的系统调用 strace 命令。

带有一组特定系统调用的 Strace 命令输出带有一组特定系统调用的 strace 命令输出

在上图中,您可以看到,当我们在 strace 命令,它只输出该程序在执行时进行的那些系统调用。

使用 strace 命令跟踪具有 PID 的进程和子进程

-p 选项用于定义 PID(进程 ID)和 -F 选项用于指定 strace 跟随子进程。

子进程只不过是另一个进程创建的进程。 使用 PID 跟踪进程并跟踪子进程的语法:

sudo strace -f -p pid

为了测试它,让我们附上 strace 到 bash:

使用 ps 命令可以快速找出PID。 我们有两个终端会话,一个用于输出 strace 命令和另一个终端空闲 bash 会议。 另一个空闲的 PID bash 我们系统上的会话是 3804。

当我们执行上面的语法时,可以看到idle bash 会话正在等待输入。

将进程附加到空闲 Bash 会话将进程附加到空闲 bash 会议

现在,如果我们在空闲时提供输入 bash 会话,您可以看到 strace 在另一个终端会话上提供输出。

附加进程的 Strace 输出附加进程的 strace 输出

进程使用 strace 进行的系统调用总结

要获取进程进行的所有系统调用的摘要, -C 选项与 strace 命令。

获取系统调用摘要的语法 strace 命令:

strace -c curl google.com
表格形式的系统调用摘要表格形式的系统调用摘要

结论

strace 是用于调试、诊断、学习系统调用等的一个很好的实用程序。 这是一个非常强大和方便的工具。 它适用于所有 Linux 发行版。

感谢您的阅读! ?