Andoird日志分析

  1. logcat命令
  2. bugreport命令
  3. dumpsys命令
  4. top命令
  5. dmesg

定义
logcat是android中的一个命令行工具,可以用于得到程序的log信息

android log系统
在这里插入图片描述
logcat命令格式

语法格式:

[adb] logcat [<option>] … [<filter – spec>] …

PC端使用:

adb logcat

shell模式下使用:

logcat

二、logcat缓冲区
1.缓冲区介绍
android log输出量巨大,特别是通信系统的log,因此,android把log输出到不同的缓冲区中,目前定义了四个log缓冲区:

1)Radio:输出通信系统的log

2)System:输出系统组件的log

3)Event:输出event模块的log

4)Main:所有java层的log,遗迹不属于上面3层的log

缓冲区主要给系统组件使用,一般的应用不需要关心,应用的log都输出到main缓冲区中

默认log输出(不指定缓冲区的情况下)是输出System和Main缓冲区的log
2.缓冲区模型
在这里插入图片描述
3.获取缓冲区命令

-b 加载一个可使用的日志缓冲区提供查看,默认值是main

adb logcat –b radio
adb logcat –b system
adb logcat –b events
adb logcat –b main

logcat命令参数

参数描述
-b 加载一个可使用的日志缓冲区供查看,比如event和radio。默认值是main
-c清除缓冲区中的全部日志并退出(清除完后可以使用-g查看缓冲区)
-d将缓冲区的log转存到屏幕中然后退出
-f 将log输出到指定的文件中<文件名>.默认为标准输出(stdout)
-g打印日志缓冲区的大小并退出
-n 设置日志的最大数目,默认值是4,需要和-r选项一起使用
-r 没时输出日志,默认值是16,需要和-f选项一起使用
-s设置过滤器
-v 设置输出格式的日志消息。默认是短暂的格式。支持的格式列表

一般长时间输出log的话建议-f,-n,-r三个参数连用,这样当一个文件日志输出满了之后可以马上在另一个中进行输出

e.g.

//将缓冲区的log打印到屏幕并退出
adb logcat -d 
//清除缓冲区log(testCase运行前可以先清除一下)
adb logcat -c
//打印缓冲区大小并退出
adb logcat -g
//输出log
adb logcat -f /data/local/tmp/log.txt -n 10 -r 1

2.bugreport命令
这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumpsys,dumpstate和logcat信息,是一份完整的日志记录。对分析用户行为,异常信息,系统状态有很大的参考作用。一般我们会把bugreport导出到电脑上分析。

adb bugreport > xxx.log

我再次强调,bugreport里面包含丰富的系统和用户信息,它是其他很多命令输出的结果的记录,非常有用。

3.dumpsys命令
这个查看系统信息,用的还是比较多的.

dumpsys [options]
               meminfo 显示内存信息
               cpuinfo 显示CPU信息
               account 显示accounts信息
               activity 显示所有的activities的信息
               window 显示键盘,窗口和它们的关系
               wifi 显示wifi信息

例如查看某个程序内存信息:

#查看应用com.tianxia.test的内存使用情况
adb shell dumpsys meminfo com.tianxia.test

在这里插入图片描述
里面的信息很有价值,尤其对于分析内存泄露,内存溢出都有极大的作用。

这个查看cpu信息太方便了。

top -m 5 -t

我们看看效果图,其中按cpu大小列出5个进程列表。
在这里插入图片描述

com.tianxia.test的cpu过高,会导致手机发烫。同时利用这个信息,可以监控应用cpu的使用,以调整优化代码。

5.配置文件local.prop

log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE

把上述文本加到/data/local.prop中,如果没有这个文件自行创建。然后重启手机,就能看到每个应用详细的查询数据库的sql语句信息,对于调试数据库,分析和优化数据库sql异常非常有用。
查看数据库,可以使用三方数据库查看软件,非常方便,缺点是侵入式,可以看这篇

  1. db shell
    6.1 am
adb shell  am start +包名/.Activity (要启动的Activity)     
启动一个 Activity 
(-s先停止目标应用,再启动  
-w 等待应用完成启动  
-a 启动默认浏览器打开一个网页例:adb shell am start -a android.intent.action.VIEW 
-d http://testerhome.com)

adb shell am monitor        监控 crash 与 ANR
adb shell am force-stop    后跟包名,结束应用
adb shell am startservice    启动一个服务
adb shell am broadcast       发送一个广播

6.2 pm
Package Manager , 可以用获取到一些安装在 Android 设备上得应用信息

adb shell pm list package      列出所有的应用的包名 (-s:列出系统应用  -3:列出第三方应用 -f:列出应用包名及对应的apk名及存放位置  -i:列出应用包名及其安装来源)
adb shell pm path+包名     列出对应包名.apk 位置
adb shell pm install +apk存放路径   安装应用(目标 apk 存放于PC端,用 adb install 安装   目标 apk 存放于Android设备上,用 pm install 安装)

电话拨号界面输入 这串
*#9646633#打开android手机调试界面

这篇帖子不错
App调试的几个命令实践
adb 实时输出logcat日志到指定文件

mtklog结构及分析

1.mtklog简介:mtklog是由log生成工具MTKLogger生成的一系列问题追踪文件,其主要作用就是对系统或者应用产生的异常进行快速定位,从而解决问题。

mtklog 的分类:MDLog、Mobile Log、Network Log,可能出现的aee_exp log

MD log:medom 相关底层的log

Mobile Log:主要是Android log 和kernel log

Network log:网络相关log

aee_exp log :crash ANR 重启相关的log输出

2.mtklog 的开启和关闭:

(1)在拨号盘界面输入*#9646633# :

(2)进入EngineerMode的第一个Telephony界面:

(3)向左滑动进入Log and Debugging界面:

(4)点击MTKLogger 菜单:

点击log设置图标可进入log设置界面,如果我只要打印MobileLog可将ModemLog,NetworkLog,GPSlog关闭,点击蓝底色1 即可:

(5)点击开始(红色播放按键)按键:

(6)log 开启:

(7)当我们已经发现异常时,当关闭log,并截图记录时间点,下拉进入下拉栏界面,点击MTKLogger is running:

(8)点击停止按键:

如图关闭成功:

3.mtklog的导出和分析:

(1)MTKLogger停止后,手机USB,下拉下拉栏,点击USB for charging,切换至MTP模式:

Transfer files(MTP);

(2)双击:便携设备:

(3)在内部存储中找到mtklog文件夹复制粘贴到本地:

(4)打开mtklog文件夹:

(4)关于分析log,我们主要分析mobilelog 文件夹中的对应Android log 和 kernel log:

对应log文件名称为:

crash_log :崩溃日志,主要输出 程序崩溃造成的crash log

events_log:事件日志,主要输出记录各个activity周期及事件

kernel_log:底层驱动,按键,低内存相关log

sys_log:系统日志,Exception定位点

radio_log:输出通话,网络状态变化

main_log:详尽输出每一步的log

分析kernel log安装可查看对应kernal_log的时间点:

安装成功之后,如下操作打开kernal_log.localtime文件可查看带时间点的kernal log:

(5)常见异常分析:

1.编译报错:

在build.log 中搜索unfinished 关键字,查找上文能够很快定位报错原因,或者搜索 error: 关键字能够直接定位相关报错文件(注意是搜索error和冒号)

2.程序崩溃(系统提示***已停止运行):

(1)启动崩溃:一般情况为第三方预置缺少库文件,或者兼容性问题

(2)应用间交互崩溃:startActivity找不多对应包名或者类名,或者无对应启动Activity的权限

(3)APP内部逻辑空指针异常导致程序崩溃(NullPointerException)

以上三种情况都可在mtklog\mobilelog\APLog_2016_0505_115433\events_log 文件中搜索 crash 关键字快速定位问题点,crash_log中可查看对应问题产生原因:

Line 4201: 03-29 11:25:32.894092 939 949 I am_crash:[9337,0,com.bbm,954744388,java.lang.UnsatisfiedLinkError,dalvik.system.PathClassLoader[DexPathList[[zip file"/system/framework/com.google.android.maps.jar", zip file"/data/app/com.bbm-1/base.apk"],nativeLibraryDirectories=[/data/app-lib/com.bbm-1,/data/app/com.bbm-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]]couldn't find "libgnustl_shared.so",Runtime.java,367]
Line 4202: 03-29 11:25:32.910190 939 949 Iam_finish_activity: [0,198242511,14,com.bbm/.ui.activities.StartupActivity,force-crash]

3.程序闪退:

(1)外部原因:物理内存不足,被kill,events_log中搜索 low_memory 关键字,以确定低内存杀死程序,kernal_log 中有存在对应时间点被 low memory kill如下:

05-10 11:36:22.588540 923 1439 Iam_low_memory: 19
05-10 11:36:22.594222 923 938 I am_destroy_activity:[0,205784777,125,com.mediatek.filemanager/.MainFilemanagerActivity,finish-idle]
05-10 11:36:22.599262 923 923 I notification_cancel_all:[1000,923,com.mediatek.filemanager,0,0,0,5,NULL]
05-10 11:36:22.601661 923 923 I notification_cancel_all:[1000,923,com.android.providers.downloads,0,0,0,5,NULL]
05-10 11:36:22.650000 2036 2036 I auditd : type=1400 audit(0.0:347): avc:denied

{ read } for comm="GpuAppSpectator" name="cmdline"dev="proc" ino=10905 scontext=u:r:gas_srv:s0tcontext=u:r:system_app:s0 tclass=file permissive=0
05-10 11:36:22.869048 923 1910 Iam_proc_bound: [0,3769,com.cyin.himgr]
05-10 11:36:23.403472 1532 1532 Iam_on_resume_called:[0,com.android.hios.launcher3.Launcher]
05-10 11:36:23.650000 2036 2036 I auditd :type=1400 audit(0.0:348): avc: denied { read }

forcomm="GpuAppSpectator" name="cmdline" dev="proc"ino=10905 scontext=u:r:gas_srv:s0 tcontext=u:r:system_app:s0 tclass=filepermissive=0
05-10 11:36:23.965602 923 938 I am_destroy_activity:[0,102727749,125,com.android.packageinstaller/.InstallAppProgress,finish-imm]
05-10 11:36:23.972491 241 241 I sf_frame_dur:[com.android.packageinstaller/com.android.packageinstaller.InstallAppProgress,2375,9,1,0,1,0,0]
05-10 11:36:24.126262 923 1520 I netstats_mobile_sample: [0,0,0,0,0,0,0,0,0,0,0,0,-1]
05-10 11:36:24.126560 923 1520 I netstats_wifi_sample:[64660,844,36398,408,33328,147,33388,197,32228,126,33388,197,-1]
05-10 11:36:24.244910 923 934 I am_proc_died: [0,3665,com.android.packageinstaller]
05-10 11:36:24.245968 923 934 I wm_task_removed: [125,removeAppToken: last token]
05-10 11:36:24.246168 923 934 I wm_task_removed: [125,removeTask]

05-10 11:36:24.248168 923 934 I am_low_memory: 19
05-10 11:36:24.255912 923 923 I notification_cancel_all:[1000,923,com.android.packageinstaller,0,0,0,5,NULL]
05-10 11:36:24.318915 923 933 Inetstats_mobile_sample: [0,0,0,0,0,0,0,0,0,0,0,0,-1]

(2)内部原因:main_log/sys_log 搜索Exception 或者 died关键字定位对应包名,进而定位问题

4.ANR问题:

出现ANR应当提供traces.txt文件,直接在文件中搜索 cmd 关键字,定位问题点。锁定三个方向:memoryleak(是否为低内存),CPU block(CPU使用率过高)、iowait(IO流使用过于频繁)

(1)memoryleak:首先根据Android log搜索低内存相关 low_memory 关键字,以确定是否存在低内存现象

(2)CPU block:搜索对应包出现ANR前后 TOTAL 关键字前的百分比,若百分比接近100% 说明CPU饥饿导致了ANR:

(3)iowait:搜索iowait 关键字查看出现ANR前的百分比,若百分比过高,说明I/O流使用过于频繁导致ANR,此项需修改相关数据库的加载流程,如下:

4-0113:12:15.872 E/ActivityManager(  220):  5.5%21404/com.android.email: 1.3% user + 4.1% kernel / faults: 10 minor

04-0113:12:15.872 E/ActivityManager(  220):  4.3%220/system_server: 2.7% user + 1.5% kernel / faults: 11 minor 2 major

04-0113:12:15.872 E/ActivityManager(  220):  0.9%52/spi_qsd.0: 0% user + 0.9% kernel

04-0113:12:15.872 E/ActivityManager(  220):  0.5%65/irq/170-cyttsp-: 0% user + 0.5% kernel

04-0113:12:15.872 E/ActivityManager(  220):   0.5%296/com.android.systemui:0.5% user + 0% kernel

04-0113:12:15.872 E/ActivityManager(  220): 100%TOTAL:4.8% user + 7.6% kernel + 87% iowait

04-0113:12:15.872 E/ActivityManager(  220):CPUusagefrom 3697ms to 4223ms later:-- ANR后CPU的使用量

04-0113:12:15.872 E/ActivityManager(  220):  25%21404/com.android.email: 25% user + 0% kernel / faults: 191 minor

04-0113:12:15.872 E/ActivityManager( 220):    16% 21603/__eas(par.hakan: 16% user + 0% kernel

04-0113:12:15.872 E/ActivityManager( 220):    7.2% 21406/GC: 7.2% user + 0% kernel

04-0113:12:15.872 E/ActivityManager( 220):    1.8% 21409/Compiler: 1.8% user + 0% kernel

04-0113:12:15.872 E/ActivityManager(  220):  5.5%220/system_server: 0% user + 5.5% kernel / faults: 1 minor

04-0113:12:15.872 E/ActivityManager( 220):    5.5% 263/InputDispatcher: 0% user + 5.5% kernel

04-0113:12:15.872 E/ActivityManager(  220): 32%TOTAL:28% user + 3.7% kernel
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值