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

将 strace 的输出写入文件
执行 strace
命令与 -O 将输出写入文件,您可以稍后查看。
将输出写入文件 strace
命令 curl
命令执行:
strace -o curl.out curl google.com

使用 strace 跟踪进程的特定系统调用
要跟踪特定的系统调用, 痕迹 表达式与 -e 选项中 strace
命令。
要使用的跟踪表达式的语法 strace
命令 curl
命令执行:
strace -e trace=syscall_set curl google.com
在哪里 syscall_set
是指定的系统调用集。

在上图中,您可以看到,当我们指定 socket
系统调用在 strace
命令,它只打印出 socket
系统调用。
类似地,我们可以定义一组我们想要打印的系统调用 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 会话,您可以看到 strace 在另一个终端会话上给出输出。

进程使用 strace 进行的系统调用摘要
要获取进程进行的所有系统调用的摘要, -C 选项用于 strace
命令。
使用以下命令获取系统调用摘要的语法 strace
命令:
strace -c curl google.com

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