一、log 分类
aplog
modem log
anr log
panic log
tombstones log
dropbox log
monkey log
last_kernel log
二、aplog
aplog 是分析android 系统问题的基本log,不管是应用crash、 ANR 还是别的各种系统异常,aplog都是很有必要的。
1). aplog 包含android log 和 kernel log,通过 logcat 命令可以捕获。
-n 指的是循环保存多少个log文件
-r 指每个log文件最大size,单位是k。-r20480 指的是20M。
-f 是log文件路径
2). Aplog读写最终由kernel
Log 设备节点:
/dev/log/main
/dev/log/radio
/dev/log/system
/dev/log/events
3). Kernel log 控制:
下面是kernel 定义的log等级
#define KERN_EMERG
#define KERN_ALERT
#define KERN_CRIT
#define KERN_ERR
#define KERN_WARNING
#define KERN_NOTICE
#define KERN_INFO
#define KERN_DEBUG
可以在启动kernel 命令行那里定义需要打印的log等级,比如下面定义打印log等级是8,那么所有小于等于这个值的log level都将被打印,否则不打印。
BOARD_KERNEL_CMDLINE += loglevel=8
如果loglevel 定义成0,那么等级从 1至7的log将不被打印。
可以通过cat /proc/sys/kernel/printk 查看当前的log等级
cat /proc/sys/kernel/printk
0
可以重新设置系统log等级,如下。
echo 8
4). native 层log 打印:
使用LOGE, LOGI, LOGD, LOGV, LOGW 接口打印log,一般默认只有LOGE是打开的,如需要打印别的log,需要在使用时定义#define LOG_NDEBUG 0 或者干脆 #undef NDEBUG
可见 system/core/include/log/log.h 中定义。
二、modem log
离线modem log保存也是很必要的,在场测过程,在遇到一些非毕现信号问题,都需要开启离线modem log。
不同的平台,不同的modem芯片,捕获modem log方法不太一样,大致流程都是打开对应的modem log 端口,发送相应AT指令(如AT+TRACE=1 或at+xsystrace=1) 打开log,之后从端口读取log。
三、ANR log
Android 默认如下情况将产生ANR:
l应用处理前台广播超过10秒
l应用处理后台广播超过60秒
l应用处理按键消息超过5秒
l应用或者系统启动一个服务超过10秒
所以处理广播和按键消息时不应该直接执行太耗时的动作,可以另外启动线程了执行耗时的动作。
产生ANR时在aplog 中里找到相应的ANR log,从这里能看到ANR发生前后CPU的使用情况。如果CPU负载高,需要再看哪个进程引起的,是否读写IO,UI线程执行了耗时动作等;如果CPU负载不高,那可能是系统被死锁,死循环给block住了,需要从每个进程的stack信息中进一步分析。
E ActivityManager: ANR in com.google.android.googlequicksearchbox:search
…
E ActivityManager: CPU usage from 0ms to 8189ms later:
E ActivityManager:105% 11139/com.google.android.googlequicksearchbox:search: 96% user + 8.6% kernel / faults: 37407 minor 19 major
…
E ActivityManager: 52% TOTAL: 32% user + 19% kernel + 0.8% iowait + 0.2% softirq
E ActivityManager: CPU usage from 7600ms to 8144ms later:
…
E ActivityManager: 29% TOTAL: 26% user + 2.9% kernel
同时各进程执行stack保存在/data/anr/trace.txt目录下。一般搜索“held by”字符,看lock 是被哪个线程占用了。然后再分析对应线程正在执行什么动作。
四、panic log
Panic log是分析kernel重启的重要手段,一般能显示重启原因,如空指针重启,狗重启,soft reset、hard rest、调用堆栈信息等。
在启动kernel 时通过配置 BOARD_KERNEL_CMDLINE += softlockup_panic=0 开启关闭panic开关(0关1开)
也可以通过写设备节点来控制(/proc/sys/kernel/softlockup_panic)
panic log 在/data/dontpanic 目录下,如果这里没有保存下来,在
/data/syttem/dropbox/SYSTEM_LAST_KMSGxxx.txt.gz 里也能看到。
手动触发panic 命令:echo c > /proc/sysrq-trigger
五、tombstones log
Native 层出现crash时产生tombstones log,保存在/data/tombstones 目录下,里面保存了调用堆栈和寄存器信息,需要共享库符号表和addr2line工具来分析。
六、dropbox log
Dropbox 收集了系统重启、crash 、anr等信息,在分析相应问题的时候可以参考Dropbox 目录下的对应文件。
在data/sytem/dropbox 目录下。
七、monkey log
是跑monkey时产生的log,里面记录monkey运行过程的一些信息,比如时间点。Monkey 跑停时可以根据monkey log里的时间点和aplog 对应上。Monkey 问题分析同时需要monkey log和 aplog 等log。
八、last_kernel log
Last_kernel log 保存上次重启前的kernel log,该log有助于我们分析重启问题。
通过配置CONFIG_PSTORE=y 打开该功能。