原文:http://www.androidlearner.net/using-chkbugreport-analysis-bugreport.html
一、ChkBugReport介紹
ChkBugReport是一個開源工具,它可以把你得到的bugreprot解析成適合閱讀的html檔案。匯出的html檔案包含了根據bugreport資料得出的圖表和分析結論。
它的源碼中用到了以下開源類庫: jQuery ,jsTree jQuery plugin , tablednd jQuery plugin , tablesorter jQuery plugin ,js-hotkeys, jquery-cookie 。學習輸出報告文檔型html可以參考源碼。
目前ChkBugReport可以從bugreport資料中抽取出如下資訊:
1、Stacktraces ChkBugReport可以從bugreport中解析出輸出bugreport的最後時刻、導致ANR時刻甚至更多時刻的堆棧資訊。在例子中你可以看到進程的優先順序和策略都已標示出來,堆棧中耗時的部分顏色是黑紅,一些違反Strict Mode的部分(比如主線程中使用資料庫)顏色標記為亮紅。如果這個線程死結,在報告的Errors將會出現。
2、Logs 這部分是對system、main和kernel日誌的分析,在這裡你可以看到每個進程記憶體使用量圖、那個程式產生的log最多、Activity的啟動耗時、資料庫操作耗時統計、對象被鎖定時間、AIDL調用時間、Activity和Service的生命週期及其在記憶體中使用頻率等等,詳見
3、Packages ChkBugReport解析bugreport中儲存的packages.xml並展示一系列的packages、user ids和 permissions。參見
4、Processes 操作app過程中產生的系統事件日誌、記憶體使用量資訊等等,參見
5、Battery statistics 電池使用統計資訊,參見
6、CPU Frequency statistics CPU頻率統計資訊,參見
7、Raw data 被分割成小段的未經處理資料
同時ChkBugReport也可以檢測到(潛在的)錯誤,這些錯誤在輸出的報告Errors部分中可以找到。你也可以在輸出報告的stacktrace中找到死結或一些違反Strict Mode的行為。
二、ChkBugReport使用
使用很簡單:
1 |
java -jar $HOME/Downloads/chkbugreport.jar $HOME/tmp/bugreport.txt |
你也可以把chkbugreport.jar加到path下,然後這樣使用
1 |
chkbugreport thebugreport.txt |
該工具將根據你的bugreport資料輸出一個分析結果目錄bugreport_out。
你可以使用如下命令取得bugreport:
1 |
adb shell bugreport > bugreport.txt |
當然你可以使用ChkBugReport分析bugreport的部分資料比如/data/anr/traces.txt
1 |
chkbugreport -sl:the_system_log.txt -sa:traces.txt dummy |
這將輸出分析結果到dummy_out。
你甚至可以使用ChkBugReport分析traceview產生的資料
1 |
chkbugreport -t something.prof |
Prof資料產生方法可以參考以下方法:
1、可以使用eclipse外掛程式traceview產生
2、也可以按如下步驟:
a.用adb shell ps列出所有進程並找出你想要trace的進程的PID
b.執行adb shell am profile PID start /data/profile.dat,開始分析
c.操作你的app
d.執行adb shell am profile PID stop ,停止分析
e.匯出資料並清除臨時檔案:adb pull /data/profile.dat adb shell rm /data/profile.dat
f.使用ChkBugReport進行分析 chkbugreport -t profile.dat
chkbugreport的常見參數如下:
chkbugreport常用參數
其他參數(較少使用):
chkbugreport不常用參數
三、相關參考
1、開源工具ChkBugReport介紹
2、ChkBugReport源碼
3、ChkBugReport最新jar包下載電梯
4、使用ChkBugReport輸出的報告例子
a.進程死結的簡單例子
b.兩個進程相互調用對方的AIDL導致阻塞的死結例子
c.這個例子結合了上面兩例子(由於一進程調用AIDL阻塞造成另一線程死結)