🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### strace `strace(1)`命令行实用程序允许你跟踪系统调用和信号。由于`strace(1)`仅适用于 Linux 计算机,因此本节将使用 Debian Linux 计算机展示`strace(1)`。 `strace(1)`生成的输出如下所示: ```shell $ strace ls execve("/bin/ls", ["ls"], [/* 15 vars */]) = 0 brk(0) = 0x186c000 fstat(3, {st_mode=S_IFREG|0644, st_size=35288, ...}) = 0 ``` `strace(1)`输出显示每个系统调用及其参数和返回值。请注意,在 UNIX 世界中,返回值为 0 是一件好事。 为了处理二进制文件,你需要将`strace(1)`命令放在要处理的可执行文件的前面。但是,你将需要自己解释输出,以便从中得出有用的结论。好消息是,像`grep(1)`这样的工具可以为你提供你真正想要的输出: ```shell $ strace find /usr 2>&1 | grep ioctl ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffe3bc59c50) = -1 ENOTTY (Inappropriate ioctl for device) ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffe3bc59be0) = -1 ENOTTY (Inappropriate ioctl for device) ``` 与`-c`命令行选项一起使用时,`strace(1)`工具可以为每个系统调用打印计数时间,调用信息和错误信息: ```shell $ strace -c find /usr 1>/dev/null % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ------------- 82.88 0.063223 2 39228 getdents 16.60 0.012664 1 19587 getdents 0.16 0.000119 0 19618 13 open ``` 由于普通程序输出以标准输出打印,而`strace(1)`的输出以标准错误打印,因此上一条命令将丢弃所检查命令的输出,并显示`strace(1)`的输出。从输出的最后一行可以看到,`open(2)`系统调用被调用了 19,618 次,产生了 13 个错误,并且花费了整个命令执行时间的 0.16%大约 0.000119 秒。