原文链接: http://www.androidlearner.net/using-chkbugreport-analysis-bugreport.html
一、ChkBugReport简介
ChkBugReport 是一个开源工具,它能够将你获取的Bugreport解析成易于阅读的HTML文件。生成的HTML文件包含基于Bugreport数据的各种图表和分析结论。
该工具的源码中使用了多个开源库,包括 jQuery、jsTree jQuery 插件、tablednd jQuery 插件、tablesorter jQuery 插件、js-hotkeys 和 jquery-COOKIE。如果你需要学习如何生成报告文档型的HTML,可以参考其源码。
目前,ChkBugReport可以从Bugreport数据中提取以下信息:
1. 堆栈跟踪 (Stacktraces): ChkBugReport 可以从Bugreport中解析出输出Bugreport的最后时刻、导致ANR(应用程序无响应)时刻以及其他关键时刻的堆栈信息。例如,你可以看到进程的优先级和策略,堆栈中耗时的部分会以黑色和红色标记,违反Strict Mode的行为(如在主线程中使用数据库)会以亮红色标记。如果线程发生死锁,报告的Errors部分会显示相关信息。
2. 日志 (Logs): 这部分对system、main和kernel日志进行分析,展示每个进程的内存使用情况、产生日志最多的程序、Activity的启动耗时、数据库操作耗时统计、对象被锁定的时间、AIDL调用时间、Activity和Service的生命周期及其在内存中的使用频率等。
3. 包信息 (Packages): 解析Bugreport中存储的packages.xml文件,展示一系列的包、用户ID和权限。
4. 进程信息 (Processes): 包括操作应用过程中产生的系统事件日志和内存使用信息。
5. 电池统计 (Battery statistics): 提供电池使用情况的统计信息。
6. CPU频率统计 (CPU Frequency statistics): 提供CPU频率的统计信息。
7. 原始数据 (Raw data): 将原始数据分割成小段。
ChkBugReport还可以检测到潜在的错误,这些错误会在输出报告的Errors部分中显示。你可以在输出报告的堆栈跟踪中找到死锁或违反Strict Mode的行为。
二、ChkBugReport使用方法
使用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列出所有进程,并找到你要追踪的进程的PID。
b. 执行adb shell am profile PID start /data/profile.dat,开始分析。
c. 操作你的应用。
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阻塞导致另一个线程死锁)