Strace

解碼/匯總 strace 日誌

  • August 16, 2021

好的,所以strace產生大量輸出已經不是什麼秘密了。(我知道有多種選項可以對輸出進行一些過濾。)

是否有任何工具可以將原始strace日誌處理為更易於閱讀的內容?

我在尋找什麼樣的“解碼”?好吧,按設計strace在非常低的水平上工作。我正在尋找可以總結最重要觀點的東西。例如,FD 4 可能在不同的時刻指向不同的文件;讓機器而不是我來跟踪這一點會很有用。PID 同上。我希望能夠在跟踪的不同時刻看到程序樹,等等。GUI 工具會很棒,但如果它使事情更容易理解,即使是基於文本的東西也是可以接受的。

strace 執行時的總結

strace有一個-c開關,它將為您提供已進行的各種系統呼叫的摘要報告。

摘錄 strace 手冊頁

-c      Count time, calls, and errors for each system call and report a 
       summary on program exit.  On Linux, this attempts to show system 
       time (CPU  time  spent  running in the kernel) independent of wall 
       clock time.  If -c is used with -f or -F (below), only aggregate 
       totals for all traced processes are kept.

例子

$ strace -c systemctl list-unit-files --type=service
...
...
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
51.81    0.001831        1831         1           waitid
 8.15    0.000288           7        39           mmap
 7.89    0.000279          19        15           read
 6.11    0.000216           8        26           mprotect
 4.56    0.000161          11        15           open
 2.91    0.000103         103         1           connect
 2.24    0.000079          79         1           clone
 2.15    0.000076          38         2           statfs
 2.01    0.000071           4        19           close
 1.95    0.000069           5        13           poll
 1.90    0.000067           5        14         2 recvmsg
 1.70    0.000060           4        16           fstat
 0.88    0.000031           8         4         3 stat
 0.82    0.000029          29         1           socket
 0.65    0.000023           8         3           munmap
 0.57    0.000020           5         4           sendto
 0.42    0.000015           5         3           ioctl
 0.40    0.000014           7         2           lstat
 0.40    0.000014           7         2           sendmsg
 0.34    0.000012           4         3           brk
 0.23    0.000008           8         1           pipe
 0.23    0.000008           4         2           fcntl
 0.20    0.000007           4         2           rt_sigaction
 0.20    0.000007           7         1         1 access
 0.20    0.000007           4         2           geteuid
 0.17    0.000006           6         1           execve
 0.14    0.000005           5         1           getsockname
 0.11    0.000004           4         1           dup2
 0.11    0.000004           4         1           getresuid
 0.11    0.000004           4         1           getresgid
 0.11    0.000004           4         1           arch_prctl
 0.08    0.000003           3         1           rt_sigprocmask
 0.08    0.000003           3         1           getrlimit
 0.08    0.000003           3         1           set_tid_address
 0.08    0.000003           3         1           set_robust_list
 0.00    0.000000           0         4           write
 0.00    0.000000           0         1           kill
------ ----------- ----------- --------- --------- ----------------
100.00    0.003534                   207         6 total

事後分析 strace 日誌

我發現了這個 Perl 腳本Strace_analyzer.pl,它聽起來像你要找的東西。

用法

$ ./strace_analyzer_ng_0.03.pl -help
Usage: strace-analyze [OPTION]… [FILE]
Analyzes strace output for IO functions. It creates statistics
on IO functions and performance of the read and write functions.
The strace file should have been run with ‘strace -tt [PROGRAM]

我在上面連結到的頁面上有一個輸出範例。在這裡發帖太長了。我也在 pastebin.com 上發布過。

strace、ioapps 的替代品

我遇到了這個名為的應用程序ioapps,它可以讓您更直覺地了解您的應用程序在執行時正在做什麼。也許這對於您要完成的工作可能比處理strace日誌更好。

用法

  $ ioprofiler-trace thunderbird

載入後,我們只需關閉 Thunderbird 視窗並檢查我們有一個名為“ioproftrace.log”的跟踪日誌,因為這是日誌的預設名稱(可以使用 -o 命令行選項指定另一個名稱):

  $ ls -l ioproftrace.log 
  -rw-r--r-- 1 user user 74890554 Apr  4 22:04 ioproftrace.log

看起來沒問題,所以我們可以在它上面執行 ioprofiler:

  $ ioprofiler ioproftrace.log 

範例 GUI    ss1

strace 的另一種替代方法,strace+

**注意:**項目strace+已不再維護,實際上它的許多功能已strace通過-k開關合併到預設值中。因此,您可能希望確保您的版本strace至少達到 4.9,這是該開關被合併的時候。

摘錄 strace 手冊頁

-k          Print the execution stack trace of the traced processes after 
           each system call (experimental).

strace+ 項目頁面的摘錄

strace+ 是 strace 的改進版本,它收集與每個系統呼叫相關的堆棧跟踪。由於系統呼叫需要昂貴的使用者核心上下文切換,它們通常是性能瓶頸的來源。strace+ 允許程序員進行更詳細的系統呼叫分析並確定,例如,哪些呼叫站點導致了昂貴的系統呼叫,因此具有優化的潛力。

引用自:https://unix.stackexchange.com/questions/170092