在 Linux 上应该如何使用 strace?
Linux实用程序命令使Linux成为如此强大的操作系统,虽然我们可以使用大量命令进行交互并获取有关信号和系统调用的信息,但在获取有关信息时,最常用和首选的命令系统调用和信号是linuxtrace命令。
它可用于对系统进行诊断,用于监视Linux的特定进程或指令工具。它有多种用例,其中一些用例是-
为每个系统调用打印时间戳
带时钟时间的输出线
跟踪正在运行的进程
拦截系统调用
虽然这些可能是一些用例,但在很多情况下我们可以使用strace。
在使用strace工具之前,我们必须将它安装在我们的本地机器上。请考虑下面针对不同操作系统显示的不同命令,以便在您的本地操作系统上安装strace工具。
对于Ubuntu/Debian-
sudo apt install strace
对于CentOS/RedHat-
yum install strace
对于rMacOS-
brew install strace
现在,一旦我们安装了strace,让我们考虑几个使用strace工具的示例。
下面显示的第一个示例包含将打印linux环境的linux命令系统调用的命令。
只需在终端中输入以下命令-
sudo strace df -h输出结果
root@Vostro-15-3568:/home/# strace df -h execve("/bin/df", ["df", "-h"], [/ 31 vars /]) = 0 brk(NULL) = 0x888000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = 0 open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 close(3) = 0 open("/home/cavisson/Documents/github/cavisson/prodsrc/core/netdiagnosticsagent/goAgent/lib/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT . . . .
让我们再运行一个示例,我们将通过附加该进程的ID来获取该进程进行的系统调用。
在终端中键入以下命令-
sudo strace -p pid
将上面示例中的pid替换为要获取系统调用的进程的进程ID。
示例
strace -p 1924输出结果
root@Vostro-15-3568:/home/# strace -p 1616 strace: Process 1616 attached select(11, [9 10], NULL, NULL, {0, 9427}) = 0 select(11, [9 10], NULL, NULL, {0, 10000}) = 0 . . .