前一篇博文中描述了 erl_crash.dump 文件的生成,本文主要講解如何針對 erl_crash.dump 文件進行分析。
-=-=-=- 我是88界奧斯卡頒獎禮的分隔線 -=-=-=-
首先看一下堅強兄的博文《 [Erlang 0057] Erlang 排錯利器: Erlang Crash Dump Viewer 》中的內容:html
1. 基於 crashdump_viewer 的 web 頁面進行 erl_crash.dump 分析;git
crashdump_viewer:start().
補充:github
The Crashdump Viewer is an HTML based tool for browsing Erlang crashdumps. Crashdump Viewer runs under the WebTool application.
2. 基於 recon 的 erl_crashdump_analyzer.sh 分析腳本 進行 erl_crash.dump 分析;web
-=-=-=- 我是88界奧斯卡頒獎禮的分隔線 -=-=-=-bash
文章中涉及兩種工具,下面分別說明;app
該腳本是 recon 工具套裝中的一個,詳情能夠參考 github 上的說明;
下面針對 erl_crashdump_analyzer.sh 腳本進行註釋說明。tcp
[root@YOYO Erlang]# vi erl_crashdump_analyzer.sh #!/usr/bin/env bash DUMP=$1 echo -e "analyzing $DUMP, generated on: " `head -2 $DUMP | tail -1` "\n" -- echo -e 表示接受 \ 轉義; ### SLOGAN ### grep Slogan: $DUMP -m 1 -- 僅過濾出一條(即第一條)含有 "Slogan:" 的信息 ### MEMORY ### -- 內存使用狀況統計 echo -e "\nMemory:\n===" M=`grep -m 1 'processes' $DUMP | sed "s/processes: //"` -- 獲取 "processes: " 後的數值(字節) let "m=$M/(1024*1024)" echo " processes: $m Mb" M=`grep -m 1 'processes_used' $DUMP | sed "s/processes_used: //"` let "m=$M/(1024*1024)" echo " processes_used: $m Mb" M=`grep -m 1 'system' $DUMP | sed "s/system: //"` let "m=$M/(1024*1024)" echo " system: $m Mb" M=`grep -m 1 'atom' $DUMP | sed "s/atom: //"` let "m=$M/(1024*1024)" echo " atom: $m Mb" M=`grep -m 1 'atom_used' $DUMP | sed "s/atom_used: //"` let "m=$M/(1024*1024)" echo " atom_used: $m Mb" M=`grep -m 1 'binary' $DUMP | sed "s/binary: //"` let "m=$M/(1024*1024)" echo " binary: $m Mb" M=`grep -m 1 'code' $DUMP | sed "s/code: //"` let "m=$M/(1024*1024)" echo " code: $m Mb" M=`grep -m 1 'ets' $DUMP | sed "s/ets: //"` let "m=$M/(1024*1024)" echo " ets: $m Mb" M=`grep -m 1 'total' $DUMP | sed "s/total: //"` let "m=$M/(1024*1024)" echo -e " ---\n total: $m Mb" ### PROCESS MESSAGE QUEUES LENGTHS ### echo -e "\nDifferent message queue lengths (5 largest different):\n===" grep 'Message queue len' $DUMP | sed 's/Message queue length: //g' | sort -n -r | uniq -c | head -5 -- 排序全部進程的消息隊列長度,取消息數最多的 5 個顯示出來 ### ERROR LOGGER QUEUE LENGTH ### echo -e "\nError logger queue length:\n===" grep -C 10 'Name: error_logger' $DUMP -m 1| grep 'Message queue length' | sed 's/Message queue length: //g' -- 匹配第一條 "Name: error_logger" 行,同時輸出其上下各 10 行數據,從這些數據中匹配 'Message queue length: ' 獲取其對應值 ### PORT/FILE DESCRIPTOR INFO ### echo -e "\nFile descriptors open:\n===" echo -e " UDP: " `grep 'Port controls linked-in driver:' $DUMP | grep 'udp_inet' | wc -l` -- udp_inet 對應 UDP 端口使用 echo -e " TCP: " `grep 'Port controls linked-in driver:' $DUMP | grep 'tcp_inet' | wc -l` -- tcp_inet 對應 UDP 端口使用 echo -e " Files: " `grep 'Port controls linked-in driver:' $DUMP | grep -vi 'udp_inet' | grep -vi 'tcp_inet' | wc -l` -- 去除 udp_inet 和 tcp_inet 對應的行,剩下的對應 FILE 相關使用(efile 或 tty_sl -c -e 等) echo -e " ---\n Total: " `grep 'Port controls linked-in driver:' $DUMP | wc -l` ### NUMBER OF PROCESSES ### echo -e "\nNumber of processes:\n===" grep '=proc:' $DUMP | wc -l -- 統計進程數量(以 "=proc:" 開頭的部分對應進程信息開始) ### PROC HEAPS+STACK ### echo -e "\nProcesses Heap+Stack memory sizes (words) used in the VM (5 largest different):\n===" grep 'Stack+heap' $DUMP | sed "s/Stack+heap: //g" | sort -n -r | uniq -c | head -5 -- 獲取 "Stack+heap: " 字段後的數值,排序後取前 5 ### PROC OLDHEAP ### echo -e "\nProcesses OldHeap memory sizes (words) used in the VM (5 largest different):\n===" grep 'OldHeap' $DUMP | sed "s/OldHeap: //g" | sort -n -r | uniq -c | head -5 ### PROC STATES ### echo -e "\nProcess States when crashing (sum): \n===" grep 'State: ' $DUMP | sed "s/State: //g" | sort | uniq -c -- 獲取發生 crash 時的所有進程狀態(例如 Waiting 或 Running)
分析舉例工具
[root@YOYO Erlang]# ./erl_crashdump_analyzer.sh erl_crash.dump analyzing erl_crash.dump, generated on: Thu Oct 8 09:51:53 2015 Slogan: init terminating in do_boot () Memory: === processes: 13 Mb processes_used: 13 Mb system: 24 Mb atom: 0 Mb atom_used: 0 Mb binary: 0 Mb code: 18 Mb ets: 0 Mb --- total: 38 Mb Different message queue lengths (5 largest different): === 43 0 Error logger queue length: === 0 File descriptors open: === UDP: 0 TCP: 2 Files: 4 --- Total: 6 Number of processes: === 43 Processes Heap+Stack memory sizes (words) used in the VM (5 largest different): === 4 6772 3 4185 2 2586 3 1598 5 987 Processes OldHeap memory sizes (words) used in the VM (5 largest different): === 1 46422 1 17731 2 10958 3 4185 1 2586 Process States when crashing (sum): === 1 Running 42 Waiting [root@YOYO Erlang]#
從上面的輸出中,能夠看到atom
補充:
在 lib/observer-2.0/priv/bin 路徑下還有一個 cdv 腳本封裝了針對 crashdump_viewer 的調用
spa