如何在 Linux 上使用 Strace
使用 Linux 系统时,您经常需要检查和了解进程执行的操作以及它们执行时执行的系统调用。
在执行此类任务时,Linux 内核提供了诸如 ptrace 之类的功能来调试和诊断进程。
本文讨论如何使用 strace 工具来跟踪、监视和调试与内核交互的进程。
什么是系统调用?
在我们讨论如何使用 strace 之前,您需要了解我们正在寻找什么以及它们是如何工作的。这意味着我们应该回顾一下 Linux 系统调用的基础知识。
系统调用是一种编程方法,程序可以通过它向系统内核请求服务。这是我们将用来检查用户进程和 Linux 内核之间的操作的过程。
每当用户执行发出读、写、终止、退出、绑定等请求的程序时,他们都在进行系统调用。程序使用多种系统调用来执行各种任务,例如网络、读写文件、初始化和终止进程等等。
将系统调用视为函数(它们的行为类似),因为它们可以接受参数并返回值。系统调用和普通操作的主要区别在于系统调用可以直接与内核交互。系统调用使用陷阱机制在用户空间和内核之间导航。
在Linux系统中,这种机制通过Glibc等库对用户很好地隐藏起来。
注意:系统调用和内核交互的内容比我们在本教程中讨论的内容要多得多。请参阅手册页以获取更多信息。
https://linkfy.to/syscalls
https://linkfy.to/trapmanual
如何在 Linux 上安装 strace
尽管主要 Linux 发行版中并未默认预安装 strace 工具,但这些发行版的大多数官方存储库中都提供了该工具;您可以使用默认包管理器轻松安装它。
注意:虽然我们不会介绍如何在所有系统上安装 strace,但我们将讨论如何使用主要的包管理器(例如 apt、dnf、pacman 和 yum)来安装 strace
1:Debian(apt)安装
使用以下命令安装 strace:
2:RedHat 系列(dnf 和 yum)
要使用 yum 包管理器安装 strace,请输入命令:
对于 dnf 包管理器,输入命令:
3:Arch Linux (pacman)
对于 Arch Linux 用户,可以使用以下命令安装 strace:
现在您已经安装并运行了 strace,我们可以继续学习如何使用
Strace 的基本用法:操作指南
让我们讨论基本的 strace 用法并了解命令的基本输出以及如何使用它。
注意:Strace 输出(例如系统调用名称、相应参数和返回值)由标准错误文件描述符 (stderr) 处理。
使用 strace 的基本方法是调用 strace 实用程序,然后调用我们想要了解其行为的程序名称。
这是使用 ls 命令的示例:
哇!对于 ls 这样的简单命令来说,这已经是大量输出了。
尽管我们无法讨论 strace 命令的所有输出,但我们可以提取并理解其含义。
如果您考虑上面输出中的第一行,您会注意到以下功能。
系统调用的名称
传递给系统调用的参数用括号括起来。
系统调用的返回值
因此,在第一行中,系统调用是 execve (使用指定的参数数组执行程序),系统调用的参数是 (“/bin/ls”, [“ls”, “/”], 0x7fffc4b277a8/* 13 个变量 */) 且返回值为 0。
https://linkfy.to/execve
execve 系统调用执行我们想要使用的二进制文件,在本例中,位于 (/bin/ls) 中,参数数组是我们想要列出内容的路径。
您还会注意到一个用正斜杠和星号括起来的符号。对于我们的例子:
上面的输出表示由于调用该流程而添加的变量数量。 execv 函数内的环境是通过使用 environ 外部变量来访问的,定义如下:
最终输出是返回值,本例中为 0。
您还会注意到 strace 输出的大多数行都遵循我们上面讨论的类似模式。
如何跟踪特定的系统调用
尽管 strace 提供了大量有关程序系统调用的信息,但大多数实例都会要求您过滤特定的系统调用。为此,我们将 -e 标志传递给 strace 命令,后跟我们需要的系统调用的名称。
查看 ls 命令的读取系统调用怎么样?例如:
您会注意到,这仅显示读取系统调用。
read 系统调用接受三个参数:文件描述符、缓冲区和字节数。然后,系统调用将传递的文件描述符参数中的 count 个字节读入缓冲区。
https://linkfy.to/readsyscall
系统调用总结
Strace 还允许我们获取进程所进行的系统调用的摘要。通过传递 -c 或 –summary-only 参数,我们可以获得如下所示的输出:
该命令比普通 strace 输出更有效地过滤和排列输出。要获取摘要和正常 strace 输出,请传递 -C 参数。
如何在运行进程中使用 Strace
有时,您将需要跟踪正在运行的进程。到目前为止,我们只使用了 strace 一个命令。要跟踪正在运行的进程,我们可以使用 -p 参数,后跟进程 ID (PID) 进程来将 strace 附加到它。
您可以使用top和grep、ps、htop、pidof或其他系统监控工具来获取正在运行的进程的PID。
例如,要获取apache进程的PID,我们可以使用:
这将为您提供 apache2 进程的 PID(在本例中为 PID 3514),我们可以使用它将其附加到 strace。
这应该显示类似于下图所示的输出。
Strace 将持续跟踪附加进程并在附加进程执行系统调用时显示输出。要终止跟踪,请按 CTRL + C,这会将进程与跟踪分离。
如何将 Strace 输出保存到文件
我们还可以将 strace 的输出作为参数重定向到文件。使用 -o 标志后跟文件路径作为参数,我们可以保存 strace 日志。
例如:
保存文件后,您可以稍后对其进行监控和分析。
结论
在本指南中,我们学习了如何在主要 Linux 发行版上安装和使用 strace。现在您已经了解了系统调用以及进程如何工作,您可以使用 strace 来监视和调试正在运行的系统进程。
本教程中学到的概念非常有用,主要是因为您可以使用学到的知识来监视是否有人篡改系统进程。