浅谈log定位分析

2020-07-01  本文已影响0人  炸鸡测试

小伙伴们每天测试的时候打开工程模式抓取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

上一篇下一篇

猜你喜欢

热点阅读