Linux内核调试方法总结之dumpsys
dumpsys
【用途】Android系统提供的dumpsys工具可以用来查看系统服务信息与状态。
【使用说明】
adb shell dumpsys <service> [<option>]
【常用服务解释】
编号 |
服务名称 |
功能 |
1 |
account |
显示accounts信息 |
2 |
activity |
显示所有的activities信息,包括activity栈,栈顶activity等 |
3 |
cpuinfo |
显示CPU信息,系统各进程的CPU使用率 |
4 |
window |
显示键盘、窗口和他们的关系。获取当前应用的component |
5 |
wifi |
显示wifi信息 |
7 |
package |
获取安装包信息 package $package_name |
8 |
usagestats |
每个界面的启动时间 |
9 |
statusbar |
显示状态栏相关的信息 |
10 |
meminfo |
显示内存信息。meminfo $package_name or $pid显示指定程序内存信息 |
11 |
diskstats |
显示磁盘相关信息 |
12 |
battery |
显示电池信息 |
13 |
alarm |
显示应用持锁情况,可用于分析系统无法待机的问题以及应用层死锁问题 |
14 |
input |
显示InputReader和InputDispatcher消息队列,底层事件一般通过inputevent的方式上报,通过查看消息队列,可以判断冻屏时内核是否正常(adb shell setprop sys.input.debug 1打开debug信息) |
【代码实现】
dumpsys代码在frameworks/base/cmds/dumpsys/dumpsys.cpp
所有dump信息都是由重载了Binder的dump函数的类来完成:
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args){
//TODO: xxxx
}
所有dump信息都是由ServiceManager注册的services提供的,以meminfo为例:
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中的setSystemProcess函数中注册meminfo服务:
ServiceManager.addService(“activity”, m);
ServiceManager.addService(“meminfo”,new MemBinder(m));
MemBinder->ProcessRecord->各个正在运行状态的ApplicationThread的状态(frameworks/base/core/java/android/app/ActivityThread.java),从中得到需要的meminfo的信息。