Linux内核提供了一款非常有用的调试工具,它可以跟踪某个进程调用的系统调用(以及该进程所接收到的信号)[1]。这款工具就是strace。它属于命令行工具,在使用时,我们可以把希望跟踪的应用程序直接指定为命令参数。例如:
# strace df -h
...
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\232\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1770984, ...}) = 0
mmap2(NULL, 1780508, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75b3000
Mac OS X的dtruss工具与Linux下的strace功能相同。
Cygwin环境里同样也有strace程序。如果我没搞错的话,Cygwin里的strace只能分析那些在Cygwin环境里编译出来的.exe文件。
[1] 有关syscalls的详细介绍,请参见本书第66章。