解碼/匯總 strace 日誌
好的,所以
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
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+ 允許程序員進行更詳細的系統呼叫分析並確定,例如,哪些呼叫站點導致了昂貴的系統呼叫,因此具有優化的潛力。