📜  Linux 中的 strace 命令及示例(1)

📅  最后修改于: 2023-12-03 15:17:22.212000             🧑  作者: Mango

Linux 中的 strace 命令及示例

简介

strace 命令是 Linux 下的一款系统调用跟踪工具,可以用于跟踪进程执行时的系统调用和信号传递情况,以及了解程序运行时性能问题等。

安装

在大多数 Linux 发行版中都已经预装了 strace ,如果没有预装则可以使用以下命令安装:

sudo apt-get install strace
使用

strace 命令用法如下:

strace [options] [-e expr]... command [args]

其中,options-e expr 表示 strace 命令的参数选项。command [args] 则表示将要监控的命令及其参数。

例如,下面的命令将启动一个新的 shell,在 shell 中执行一个简单的命令,并使用 strace 命令来跟踪和记录 shell 执行时所产生的系统调用:

$ strace -o /tmp/trace.log sh -c 'echo Hello World!'
Hello World!
$ cat /tmp/trace.log
execve("/bin/sh", ["sh", "-c", "echo Hello World!"], [/* 79 vars */]) = 0
brk(NULL)                               = 0x7f5f37889000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
write(1, "Hello World!\n", 13)          = 13
...
exit_group(0)                           = ?
+++ exited with 0 +++

从上面的输出可以看到,strace 命令记录了 shell 执行的系统调用信息,例如 execveopenwriteexit_group 等。

下面介绍一些常用的参数选项。

-c 选项

可以使用 -c 选项来统计跟踪进程所执行的每个系统调用执行的次数、时间和出错次数等统计信息。

例如,下面的命令将跟踪 ls 命令执行时的每个系统调用,并输出系统调用的统计信息:

$ strace -c ls
bin  Desktop  Documents  Downloads  Music  Pictures  Public  snap  Templates  Videos
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000058           0      1501         1 fstat
  0.00    0.000000           0         4           read
  0.00    0.000000           0        41           write
  0.00    0.000000           0        98           open
...

在输出结果中,第一列表示系统调用在程序运行时所占的时间百分比,第二列表示程序总的执行时间。usecs/call 表示每个系统调用平均执行时间,calls 表示系统调用的总次数,errors 则表示系统调用执行出现错误的次数。

-p 选项

使用 -p 选项可以跟踪已经在运行中的进程。例如,下面的命令将跟踪进程号为 2351 的进程的系统调用情况:

$ strace -p 2351
-t 选项

使用 -t 选项可以在输出的系统调用信息前添加时间戳。例如,下面的命令将跟踪 ls 命令的系统调用并输出时间戳:

$ strace -t ls
15:36:20 execve("/bin/ls", ["ls"], [/* 51 vars */]) = 0
15:36:20 brk(NULL)                     = 0x55c172df1000
15:36:20 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
15:36:20 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
15:36:20 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
-e 选项

使用 -e 选项可以指定要跟踪的系统调用。例如,下面的命令将跟踪 ls 命令执行时执行的 open 系统调用:

$ strace -e open ls
bin  Desktop  Documents  Downloads  Music  Pictures  Public  snap  Templates  Videos
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("..", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("..", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
...

注意,在 -e 选项后要放置系统调用的名称,多个系统调用可以用逗号分隔。

总结

本文介绍了 Linux 下的系统调用跟踪工具 strace 命令的基本用法及常用参数选项,并通过简单的示例展示了其使用方法。strace 命令可以帮助我们了解程序执行时的系统调用信息,定位程序运行中的问题。