Android中对Log日志文件的分析[转]

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一,Bug出现了, 需要“干掉”它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug,android里应用开发也就很简单了。

一,Bug出现了, 需要“干掉”它 

bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug,

android里应用开发也就很简单了。

那我们先来看看android里的ANR,怎么出现ANR呢,很简单。

          # adb shell

          # cd data/app

         #  monkey   -p  com.xxx.xxx   -v   3000      (com.xxx.xxx是你应用程序的包名,如果想知道monkey详细用法,执行  monkey  help  )

         实际上很多优秀android应用都会出现ANR,比如UC浏览器,360等等,如果你有兴趣可以回去试试,

      这样,ANR出现了。 开始做修改准备工作  ,得到log文件。

有人问log文件在哪儿?
一般在/data/log下面(但是真机才有的)。你可以通过执行命令adb shell进去看看,用pull把log文件拉到你的电脑里
 
好,得到log文件了,我们就准备开始工作了 。 我将详细的log文件上传到附件供大家参考。

下载地址为  http://download.csdn.net/detail/andy_android/3785393

二,Log的种类

          android.util.Log常用的方法有以下六个:Log.v() Log.d() Log.i() Log.w() , Log.e()以及Log.a() (android 4.0新增加的)。根据首字母对应             VERBOSEDEBUG,INFO,WARNERROR,Assert。

          1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");

          2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.

          3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息

         4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。

         5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。

         6    Log.a为4.0新增加的。

          启动 Eclipse ,打开DDMS大家可以在LogCat里看见(前提是android 4.0的ADT)

三,如何分析和研究Log文件,如何看日志信息 Logandroid中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧。 下面我们就来说说如何处理log文件。

Log分为Fatal和ANR

什么时候会有Log文件的产生?
Log
的产生大家都知道, 大家也都知道通过DDMS来看log(这个就不用说了),但什么时候会产生log文件呢?一般在如下几种情况会产生log文件。 
1
,程序异常退出,uncausedexception      (Fatal)
2
,程序强制关闭,ForceClosed (简称FC)       (Fatal)
3
,程序无响应,ApplicationNo Response(简称ANR)

                               ANR出现的情况有以下两种

                                       A  界面操作按钮的点击等待响应时间超过5秒

                                       B  HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒

4,手动生成。


拿到一个日志文件,要分成多段来看。log文件很长,其中包含十几个小单元信息,但不要被吓到,事实上他主要由三大块儿组成 。

1
,系统基本信息,包括 内存,CPU,进程队列,虚拟内存 , 垃圾回收等信息 。------MEMORY INFO (/proc/meminfo) ------
------CPU INFO (top -n 1 -d 1 -m 30 -t) ------
------PROCRANK (procrank) ------
------VIRTUAL MEMORY STATS (/proc/vmstat) ------
------VMALLOC INFO (/proc/vmallocinfo) ------

格式如下:
------MEMORY INFO (/proc/meminfo) ------
MemTotal:        347076 kB
MemFree:          56408 kB
Buffers:           7192 kB
Cached:          104064 kB
SwapCached:           0 kB
Active:          192592 kB
Inactive:         40548 kB
Active(anon):    129040 kB
Inactive(anon):    1104 kB
Active(file):     63552 kB
Inactive(file):   39444 kB
Unevictable:       7112 kB
Mlocked:              0kB
SwapTotal:            0 kB
SwapFree:             0 kB
Dirty:               44kB
Writeback:            0 kB
AnonPages:       129028 kB
Mapped:           73728 kB
Shmem:             1148kB
Slab:             13072kB
SReclaimable:      4564 kB
SUnreclaim:        8508 kB
KernelStack:       3472 kB
PageTables:       12172 kB
NFS_Unstable:         0 kB
Bounce:               0kB
WritebackTmp:         0 kB
CommitLimit:     173536 kB
Committed_AS:   7394524 kB
VmallocTotal:    319488 kB
VmallocUsed:      90752 kB
VmallocChunk:    181252 kB


2
,事件信息, 也是我们主要分析的信息 。
------VMALLOC INFO (/proc/vmallocinfo) ------
------EVENT INFO (/proc/vmallocinfo) ------

格式如下:
------SYSTEM LOG (logcat -b system -v time -d *:v) ------
01-1516:41:43.671 W/PackageManager( 2466): Unknown permissioncom.wsomacp.permission.PROVIDER in package com.android.mms
01-1516:41:43.671 I/ActivityManager( 2466): Force stopping packagecom.android.mms uid=10092
01-1516:41:43.675 I/UsageStats( 2466): Something wrong here, didn't expectcom.sec.android.app.twlauncher to be paused
01-1516:41:44.108 I/ActivityManager( 2466): Start proccom.sec.android.widgetapp.infoalarm for servicecom.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634uid=10005 gids={3003, 1015, 3002}
01-1516:41:44.175 W/ActivityManager( 2466): Activity pause timeout forHistoryRecord{48589868com.sec.android.app.twlauncher/.Launcher}
01-1516:41:50.864 I/KeyInputQueue( 2466): Input event
01-1516:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting0
01-1516:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0
01-1516:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0target=70 delta=4.6666665 nominalCurrentValue=0
01-1516:41:50.882 I/PowerManagerService( 2466): Scheduling lightanimator!
01-1516:41:51.706 D/PowerManagerService( 2466): enableLightSensortrue
01-1516:41:51.929 I/KeyInputQueue( 2466): Input event
01-1516:41:51.933 W/WindowManager( 2466): No focus window, dropping:KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26mFlags=9}



3
,虚拟机信息, 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方。 
------VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-1516:49:02) ------
------VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02)------


格式如下:
-----pid 21161 at 2011-01-15 16:49:01 -----
Cmdline: com.android.mms

DALVIKTHREADS:
"main"prio=5 tid=1 NATIVE
  |group="main" sCount=1 dsCount=0 s=N bj=0x4001d8d0self=0xccc8
  |sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
  |schedstat=( 4151552996 5342265329 10995 )
  atandroid.media.MediaPlayer._reset(Native Method)
  atandroid.media.MediaPlayer.reset(MediaPlayer.java:1218)
  atandroid.widget.VideoView.release(VideoView.java:499)
  atandroid.widget.VideoView.access$2100(VideoView.java:50)
  atandroid.widget.VideoView$6.surfaceDestroyed(VideoView.java:489)
  atandroid.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
  atandroid.view.SurfaceView.updateWindow(SurfaceView.java:476)
  atandroid.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
  atandroid.view.View.dispatchDetachedFromWindow(View.java:6082)
  atandroid.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
  atandroid.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
  atandroid.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
  atcom.android.mms.ui.SlideView.reset(SlideView.java:687)
  atcom.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
  atcom.android.mms.ui.SlideshowPresenter$3.run(SlideshowPresenter.java:531)
  atandroid.os.Handler.handleCallback(Handler.java:587)
  atandroid.os.Handler.dispatchMessage(Handler.java:92)
  atandroid.os.Looper.loop(Looper.java:123)
  atandroid.app.ActivityThread.main(ActivityThread.java:4627)
  atjava.lang.reflect.Method.invokeNative(Native Method)
  atjava.lang.reflect.Method.invoke(Method.java:521)
  atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
  atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  atdalvik.system.NativeStart.main(NativeMethod)

---------------------------------------------------------------------------------------------------------------------------------------
闲话少说,我总结了观察log文件的基本步骤。1,如果是ANR问题, 则搜索“ANR”关键词。 快速定位到关键事件信息 。
2
,如果是ForceClosed和其它异常退出信息,则搜索"Fatal"关键词,快速定位到关键事件信息 。
3
,定位到关键事件信息后, 如果信息不够明确的,再去搜索应用程序包的虚拟机信息,查看具体的进程和线程跟踪的日志,来定位到代码。 

用这种方法,出现问题,根本不需要断点调试, 直接定位到问题,屡试不爽 。 
下面,我们就开始来分析这个例子的log

打开log文件, 由于是ANR错误,因此搜索"ANR",为何要加空格呢,你加上和去掉比较一下就知道了 。可以屏蔽掉不少保存到anr.log文件的无效信息。 

定位到关键的事件信息如下:
01-1516:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
01-1516:49:02.433 E/ActivityManager( 2466): Reason:keyDispatchingTimedOut
01-1516:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42
01-1516:49:02.433 E/ActivityManager( 2466): CPU usage from 1337225ms to57ms ago:
01-1516:49:02.433 E/ActivityManager( 2466):   sensorserver_ya:8% = 0% user + 8% kernel / faults: 40 minor
......


01-1516:49:02.433 E/ActivityManager( 2466):  -com.android.mms:0% = 0% user + 0% kernel
01-1516:49:02.433 E/ActivityManager( 2466):  -flush-179:8: 0% =0% user + 0% kernel
01-1516:49:02.433 E/ActivityManager( 2466): TOTAL: 25% = 10% user + 14%kernel + 0% iowait + 0% irq + 0% softirq
01-1516:49:02.436 I/        ( 2466):dumpmesg >"/data/log/dumpstate_app_anr.log"


我们用自然语言来描述一下日志,这也算是一种能力吧。 
01-1516:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
翻译:在16:492433毫秒的时候ActivityManager

若转载请注明出处!若有疑问,请回复交流!
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
19天前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
40 8
|
1月前
|
存储 SQL 监控
|
1月前
|
运维 监控 安全
|
1月前
|
监控 关系型数据库 MySQL
分析慢查询日志
【10月更文挑战第29天】分析慢查询日志
38 3
|
1月前
|
监控 关系型数据库 数据库
怎样分析慢查询日志?
【10月更文挑战第29天】怎样分析慢查询日志?
35 2
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1674 14
|
2月前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
38 2
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
113 1
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
215 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板