Linux操作系统提供了跟踪系统调用的能力 strace
实用程序。简单的解释是,strace截取并打印相关进程发出的系统调用。我们知道Linux实际上是一个操作系统内核。操作系统内核负责设备和硬件管理、内存管理、进程管理等底层操作,为用户级进程和应用程序提供接口。Strace特别用于诊断、指导和调试操作。
语法
strace的语法如下。
strace [-CdffhikqrtttTvVxxy] [-In] [-bexecve] [-eexpr]... [-acolumn] [-ofile] [-sstrsize] [-Ppath]... -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args] strace -c[df] [-In] [-bexecve] [-eexpr]... [-Ooverhead] [-Ssortby] -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args]
救命
有关该工具的简单而快速的帮助可以通过以下命令获得。
$ strace -h

跟踪执行
Linux进程通常通过从bash调用或运行后台命令来启动。在本例中,我们将通过调用命令来启动一个进程。但是通过调用command,我们将把命令作为如下参数发送到strace。请记住,这不是仿真模式,命令将运行并完成其作业。在执行其工作时,系统调用和相关信息将打印到控制台。在跟踪诸如系统调用名称、地址、库、文件状态等信息时,将提供。
$ strace ls

跟踪特定的系统调用
在上一个示例中,我们完全跟踪了一个命令。这就产生了大量的信息和相关的输出。这对我们来说可能太多了,因为我们只寻找其中的一部分。为了使跟踪更清晰,我们可以提供要跟踪的系统调用。在下面的示例中,我们只想列出 open
用于打开文件的系统调用。
$ strace -e open ls

将跟踪结果保存到文件
到目前为止,我们已经将跟踪结果打印到终端。我们的示例过程运行起来很简单,并创建了较小的输出。但是,如果我们想运行一个漫长而复杂的过程,会发生什么呢?或者我们想稍后分析跟踪输出。在这些情况下,我们可以将跟踪输出保存到一个文件中。在本例中,我们将跟踪输出保存到名为 ls-trace.txt
通过使用 -o
选项。然后我们就可以用 cat
命令。
$ strace -o ls-trace.txt ls

跟踪已在运行的进程
在前面的示例中,我们创建了新的流程来跟踪。但在某些情况下,我们需要跟踪所有已启动并正在运行的进程。例如,我们有运行Apache的web服务器,我们希望跟踪Apache。我们如何跟踪所有准备运行的进程?首先,我们将找到我们的进程PID。
$ ps -C snapd

进程ID跟踪
我们学到了 我们的快照守护进程 snapd
有PID 1193。然后我们将这个PID提供给strace跟踪 -p
选项如下。
$ strace -p 1193

将输出写入文件
另一个有用的用法是使用 -o
选项
$ strace -o snapd-trace.txt -p 12793

以及使用 tail
命令实时读取跟踪输出。
$ tail -f snapd-trace.txt

打印时间戳
时间戳信息是非常重要的,特别是衡量性能。在strace的正常使用中,不提供时间信息。时间戳信息可以用 -t
选项。在本例中,我们只需打印时间戳,它由当前的小时、分钟和秒信息组成。
$ strace -t ls

打印相对时间戳
在上一个示例中,我们以正常的日期格式打印了时间戳信息。但我们可能需要使用相对时间戳。相对时间戳根据进程开始时间计算,进程开始时间设置为0,其他所有系统调用时间根据进程开始时间表示。
$ strace -r ls

打印时间戳更精确
在上一个示例中,我们已经打印了时间戳。在提供小时、分钟和秒信息的情况下,此时间戳具有正常精度。在某些情况下,我们可能需要从跟踪中获得更精确的度量。这个 -tt
选项将在纳秒内创建有关跟踪的更精确的度量。
$ strace -tt ls

生成系统调用统计报表
在跟踪一个进程时,使用了很多系统调用。有关这些调用的度量和统计信息可以打印在表中。此表将包括时间、秒、呼叫计数、错误和相关系统调用等指标。
$ strace -c ls

遵循分叉线
操作系统为多个进程提供线程以提高性能。一些守护进程或服务器进程(如Apache、Nginx等)主要使用线程。通常strace不跟踪这些线程。这个 -f
和 -ff
options使strace能够找到具有相关进程的线程并跟踪它们。
$ strace -f ls

相关文章: Linux Lsof命令教程及示例