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 是指定的系统调用集。

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

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

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

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

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

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

-p 选项用于定义 PID(进程 ID),并且 -F 选项用于指定 strace 跟踪子进程。

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

sudo strace -f -p pid 

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

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

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

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

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

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

进程使用 strace 进行的系统调用摘要

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

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

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

结论

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

感谢您的阅读! ?