调试系列1:bugreport源码篇

一、概述

通过adb命令可获取bugrepport信息,并输出到文件当前路径的bugreport.txt文件:

对于Android系统调试分析,bugreport信息量非常之大,几乎涵盖整个系统各个层面内容,对于分析BUG是一大利器,本文先从从源码角度来分析一下Bugreport的实现原理。

二、原理分析

Android系统源码中framework/native/cmds/bugreport目录通过Android.mk定义了bugreport项目,在系统编译完成后会生成bugreport可执行文件,位于系统/system/bin/bugreport。当执行adb bugreport时,便会调用这个可执行文件,进入bugreport.cpp中的main()方法。

2.1 bugreport.main

[-> bugreport.cpp]

该过程先启动dumpstate服务,Bugreport再通过socket建立于dumpstate的通信,这个过程会尝试20次socket连接建立直到成功连接。 在socket通道中如果持续3分钟没有任何数据可读,则超时停止读取并退出。由于dumpstate服务中不存在大于1分钟的timetout,因而不可预见的超时的情况下留有很大的回旋余地。

当从socket读取到数据后,写入到标准时输出或者重定向到文件。可见bugreport数据的来源都是dumpstate服务,那么接下来去看看dumpstate服务的工作。

2.2 dumpstate.main

[-> dumpstate.cpp]

整个过程的工作流程:

  1. 提高执行dumpsate所在进程的优先级,防止被OOM Killer杀死;
  2. 参数解析,可通过命令adb shell dumpstate -h查看dumpstate命令所支持的参数;
  3. 打开vibrator,用于在执行bugreport时,手机会先震动一下用于提醒开始抓取系统信息;
  4. 通过dump_traces()来完成收集虚拟机和native进程的stack traces;
  5. 通过get_tombstone_fds来获取tombstone文件描述符;
  6. 开始执行切换到非root用户和组,在这之前的执行都处于root权限;
  7. 执行dumpstate(),这里是真正干活的地方
  8. 再次通过震动以提醒dump操作执行完成;
  9. 发送广播,告知ActivityManager已完成bugreport操作。

接下来就重点说说dumpstate()功能:

2.3 dumpstate

该方法负责整个bugreport内容输出的最为核心的功能。

[-> dumpstate.cpp ]

该方法涉及run_command其他几个方法见下方:

2.3.1 run_command()

[-> utils.c]

功能是fork子进程并等待它执行完成,或者超时退出。当命令title不为空时,每次输出结果,都分别以下面作为开头和结尾:

2.3.2 dump_file()

[-> utils.c]

当可以正确打开文件时,则执行_dump_file_from_fd,输出文件内容

当打不开文件或者出错则输出:

当文件路径为/proc/或者/sys/,则输出时间/文件上次修改时间:

2.3.3 dump_files()

dump_files(“UPTIME MMC PERF”, mmcblk0, skip_not_stat, dump_stat_from_fd);

其中skip_not_stat是指忽略mmcblk0目录下的非stat文件,dump_files该方法遍历输出mmcblk0(即”/sys/block/mmcblk0/”)目录下所有stat文件,具体的输出调用dump_stat_from_fd方法来完成,该方法输出每个分区的读写速度:

例如:stat文件共有11个数据:

则mmcblk0p13/stat的read_perf = 512* 100/10 = 5120KB/s, write_perf= 512* 5000/250 = 10240KB/s

2.3.4 dump_traces()

dump虚拟机和native的stack traces,并返回trace文件位置

2.3.5 do_dmesg()

2.4 总结

bugreport通过socket与dumpstate服务建立通信,在dumpstate.cpp中的dumpstate()方法完成核心功能,该功能依次输出内容项, 主要分为5大类:

  1. current log: kernel,system, event, radio;
  2. last log: kernel, system, radio;
  3. vm traces: just now, last ANR, tombstones
  4. dumpsys: all, checkin, app
  5. system info:cpu, memory, io等

从bugreport内容的输出顺序的角度,再详细列举其内容:

  1. 系统build以及运行时长等相关信息;
  2. 内存/CPU/进程等信息;
  3. kernel log
  4. lsof、map及Wait-Channels;
  5. system log
  6. event log
  7. radio log;
  8. vm traces
    • just now的栈信息;
    • last ANR的栈信息;(存在则输出)
    • tombstones信息;(存在这输出)
  9. network相关信息;
  10. last kernel log;
  11. last system log;
  12. ip相关信息;
  13. 中断向量表
  14. property以及fs等信息
  15. last radio log;
  16. Binder相关信息;
  17. dumpsys all:
  18. dumpsys checkin相关:
    • dumpsys batterystats电池统计;
    • dumpsys meminfo内存
    • dumpsys netstats网络统计;
    • dumpsys procstats进程统计;
    • dumpsys usagestats使用情况;
    • dumpsys package.
  19. dumpsys app相关
    • dumpsys activity;
    • dumpsys activity service all;
    • dumpsys activity provider all.

Tips: bugreport几乎涵盖整个系统信息,内容非常长,每一个子项都以------ xxx ------开头。 例如APP ACTIVITIES的开头便是 ------ APP ACTIVITIES (dumpsys activity all) ------,其中括号内的便是输出该信息指令,即dumpsys activity all,还有可能是内容所在节点,各个子项目类似的规律,看完前面的源码分析过程,相信你肯定能明白。下面一篇文章再进一步从bugreport内容的角度来说明其寓意。

三、相关源码

作者微博:@Gityuan

原文出处:Gityuan.com

1 收藏 评论

关于作者:gityuan

Android系统工程师,www.gityuan.com博主,个人新浪微博:http://weibo.com/gityuan 个人主页 · 我的文章 · 3 ·     

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部