📅  最后修改于: 2023-12-03 15:17:22.212000             🧑  作者: Mango
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 执行的系统调用信息,例如 execve
、open
、write
、exit_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 命令可以帮助我们了解程序执行时的系统调用信息,定位程序运行中的问题。