如何用Strace命令跟踪系统调用和信号?

Linux操作系统提供了跟踪系统调用的能力 strace 实用程序。简单的解释是,strace截取并打印相关进程发出的系统调用。我们知道Linux实际上是一个操作系统内核。操作系统内核负责设备和硬件管理、内存管理、进程管理等底层操作,为用户级进程和应用程序提供接口。Strace特别用于诊断、指导和调试操作。

null

语法

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
Help strace
帮助strace

跟踪执行

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

$ strace ls
Trace Execution
跟踪执行

跟踪特定的系统调用

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

$ strace -e open ls
Trace Specific System Calls
跟踪特定的系统调用

将跟踪结果保存到文件

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

$ strace -o ls-trace.txt ls
Save Trace Result To File
将跟踪结果保存到文件

跟踪已在运行的进程

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

$ ps -C snapd
Find PID
查找PID

进程ID跟踪

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

$ strace -p 1193
Trace All Ready Running Process
跟踪已在运行的进程

将输出写入文件

另一个有用的用法是使用 -o 选项

$ strace -o snapd-trace.txt -p 12793
Trace To A File
跟踪到文件

以及使用 tail 命令实时读取跟踪输出。

$ tail -f snapd-trace.txt
Read Trace With tail
用尾巴读轨迹

打印时间戳

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

$ strace -t ls
Print Time Stamp
打印时间戳

打印相对时间戳

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

$ strace -r ls
Print Relative Time Stamp
打印相对时间戳

打印时间戳更精确

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

$ strace -tt ls
Print Time Stamp More Precise
打印时间戳更精确

生成系统调用统计报表

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

$ strace -c ls
Generate Statistics Report of System Calls
生成系统调用统计报表

遵循分叉线

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

$ strace -f ls
Follow Forked Threads
遵循分叉线

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享