浅谈log定位分析
小伙伴们每天测试的时候打开工程模式抓取mtklog,是否清楚抓取的都是一些什么类型的log呢?不同的问题出现时都查看的都是哪些log呢?
遇到问题后想先定位一下问题,看到那么多密密麻麻的log不知道从何下手呢?
一.log的类型
1、按照android系统层次划分:
android OS从上层到底层可以划分为如下:Application---Framework---Libraries---Linux Kernel
(1)发生在Java层(Application,Framework)的异常:JE
常见JE类型有:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常
(2)发生在Native层(Libraries)的异常:NE
(3)发生在kernel层的异常:KE,kernel log一般保存成文件被打包在db文件中
2、log存储文件
一般打开mtklog文件后,会生成几个文件,那每个文件分别代表什么类型的log文件呢?
1、Mobile Log:也称AP Log:是系统应用层的log,比如应用无响应或强行关闭
mobile log中有4种主要log文件:kernel ,main,events 和radio log
kernel log主要是记录kernel相关的问题,如driver(相机,蓝牙,USB)出现问题
events_log:系统事件日志,主要输出记录各个activity周期及事件
sys_log:系统日志,Exception定位点
radio_log:输出通话,网络状态变化
2、modern log:是手机里负责搜网和sim卡数据操作底层模块
3、NetWork log:主要针对网络的Network相关问题抓取
4、aee_exp:打开aee_exp,可以看到两个文件ZZ_INTERNAL,db.00.KernelAPI.dbg
ZZ_INTERNAL:是什么错误,发生错误的程序,报错时间
db.00.KernelAPI.dbg:报错的各种信息及报错时机器的各种状态信息
用GAT工具可打开db文件,打开后的部分文件显示如下:
几种主要文件信息:
__exp_main.txt:异常类型,调用栈等关键信息。
_exp_detail.txt:详细异常信息
SYS_ANDROID_LOG:android main log
SYS_KERNEL_LOG:kernel log
SYS_LAST_KMSG:上次重启前的kernel log
SYS_REBOOT_REASON:重启时的硬件记录的信息。
SYS_VERSION_INFO:kernel版本
5、traces.txt:/data/anr/traces.txt:虚拟机信息,包括进程的,线程的跟踪信息
二.log浅析
初步定位:关键字查找
常见关键字查找:"null" "error" " "E/","Fatal","NullPointerException","Build fingerprint:","exception","anr","DexOpt"等的错误信息,来定位问题
不同的模块出现问题的关键字不一样,可收集相应的关键字进行定位查找
log格式:
打开一个main_log,可看到如下信息:
抓到log后,从左到右依次是:日期,时间,进程号,线程号,log优先级,log标签
知道这些信息对我们分析log有什么用呢?
(1)时间信息:通过时间戳可以帮助快速定位问题,缩短分析时间
(2)进程号、线程号:不同的进程和线程的信息可能不会一起打印,可通过进程和线程ID将相关信息放在一起分析
(3)Log优先级:log一般划分为V,D,I,W,E
其中V代表Verbose 冗余、提醒消息,D表示Debug 调试消息,I表示Information 普通消息,W表示Warn 警告消息,E表示Error 错误消息,可通过搜索错误信息来筛选信息
常见异常分析:
1.程序崩溃(提示停止运行):启动崩溃,交互崩溃等,可在events_log中搜索crash关键字初步定位问题
2.程序闪退:stack overflow,物理内存不足等被kill,sys_log 搜索Exception 或者 died关键字定位对应包名,进而定位问题
3.ANR问题:主要分三个方向:memoryleak(是否为低内存),CPU block(CPU使用率过高)、iowait(IO流使用过于频繁),可搜索关键字ANR
ANR出现的情况主要有以下两种:
A 界面操作按钮的点击等待响应时间超过5秒
B HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒
4.强制关闭(FC):Fatal问题Fatal: 比较严重了,很多都很动态库和空指针有关,一般会接下来打印"Build fingerprint:"或”NullPointerException“
下面分享一个比较容易懂的例子,大家可以学习一下log分析定位的思路(http://redmine.meizu.com/issues/496607?from_search=true)
用例场景:com.android.phone 无响应
1.通过关键字缩小范围
无响应问题:通过FATAL关键字可查到如下log:
2.翻译log
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.android.internal.telephony.dataconnection.ApnSetting.equals(ApnSetting.java:551)
翻译以上两句可知:再调用ApnSetting的equals方法时引入了空指针的问题
3.开发修复(有时候查看开发修复的方式也能帮助我们积累定位和分析的能力)
修复方法:现修改为变量初始化时和之前项目保持一致做非空初始化
修复方法:对ApnSetting中的String类型的变量做一个非空初始化
部分修改如下:
三.adb抓取log的常用命令
在手机无响应无法进入工程模式的时候可用如下方法去启动mtklog
1.adb shell am start -n com.mediatek.mtklogger/.MainActivity
--》此命令打开MTK平台工程模式的其他log,如audio log,需要先开启root权限
2.adb shell am broadcast -a com.mediatek.mtklogger.ADB_CMD -e cmd_name start/stop --ei cmd_target 7
--》start表示开启,stop表示关闭;7可改为1/2/4,分别代表MobileLog/ModemLog/NetworkLog)
3.导出log文件
抓取完相应的log文件后就可以用:adb pull /sdcard/mtklog
小贴士: 获取开关状态,快速查看是否打开了mobile log
adb shell getprop debug.MB.running/adb shell getprop debug.mdlogger.Running-->值为0,表示未开始抓取相关log,值为1表示开始抓取相关log