strace

基本介紹

strace 是一個追蹤 system call 的工具, 可以指定追蹤某個正在跑的程式、準備執行的程式, 也可以指定要追蹤的 system call 來減少不需要的訊息, 而 strace 的實做則是仰賴 kernel 中的 ptrace。

使用範例:

-c 輸出 system call 使用統計:

$ strace -c ls > /dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0        17           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0         4         1 open
  0.00    0.000000           0         8           close
  0.00    0.000000           0         7           fstat
  0.00    0.000000           0         9           mmap
  0.00    0.000000           0         5           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         4           brk
  0.00    0.000000           0         3         3 ioctl
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         3           openat
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    67         5 total

-k 輸出每個 system call 的 stack trace, 原先來自於 strace-plus 後來 merge 回上游, 需要在編譯時有開啟 libunwind 支援:

$ strace -k ls > /dev/null
execve("/usr/bin/ls", ["ls"], 0x7ffc07df1168 /* 45 vars */) = 0
 > /usr/lib/libc-2.26.so(execve+0x7) [0xc45e7]
 > /usr/bin/strace(_init+0x166) [0x63766]
 > /usr/bin/strace(_init+0x28224) [0x8b824]
 > /usr/bin/strace(_init+0x28b63) [0x8c163]
 > /usr/bin/strace(_init+0x1d9) [0x637d9]
 > /usr/lib/libc-2.26.so(__libc_start_main+0xea) [0x20f6a]
 > /usr/bin/strace(_init+0xdaa) [0x643aa]
brk(NULL)                               = 0x55c73188c000
 > /usr/lib/ld-2.26.so(__brk+0x9) [0x19bf9]
 > /usr/lib/ld-2.26.so(_dl_sysdep_start+0x391) [0x189a1]
...