Android中对Log日志文件的分析

一,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,WARN,ERROR,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文件,如何看日志信息 。Log在android中的地位非常重要,要是作为一个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:49分2秒433毫秒的时候ActivityManager

时间: 2024-10-11 01:13:55

Android中对Log日志文件的分析的相关文章

Android Log日志文件的分析、查看

Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 什么时候会产生log文件呢 ?一般在如下几种情况会产生log文件 . 1,程序异常退出 , uncaused exception2,程序强制关闭 ,Force Closed (简称FC)3,程序无响应 , Application No Response (简称ANR) , 一般主线程超过5秒么有处理就会ANR4,手动生成 . 我们用

解决Linux下Tomcat日志目录下的catalina.log日志文件过大的问题

本文摘自:(http://blog.csdn.net/stevencn76/article/details/6246162) 分类: Java技术专区2011-03-13 12:25 5017人阅读 评论(1) 收藏 举报 tomcatlinux工具任务web 由于Tomcat在默认情况下会将没有经过配置的web应用所产生的日志输出已经其本身的日志内容都输出到这个文件中,那么随着时间的推移,这个文件的尺寸将会越来越大,当需要检查日志内容时间会导致文件难以打开,而且同时tomcat依旧在不断的向文

Android 中View的绘制机制源代码分析 三

到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编辑器.这里之所以使用"下定决心"这个词.是由于毕竟Html编辑器使用好几年了.非常多习惯都已经养成了,要改变多年的习惯确实不易.相信这也是还有非常多人坚持使用Html编辑器的原因. 这也反应了一个现象.当人对某一事物非常熟悉时,一旦出现了新的事物想代替老的事物时,人们都有一种抵触的情绪,做

实战:mysql检查物理磁盘中的二进制日志文件是否有丢失

场景:有时候因为磁盘损坏或人为原因错误删除了磁盘中的二进制文件,导致mysql中的show binary logs记录和实际的物理磁盘中的二进制文件不匹配 #binlogdiff.sh #!/bin/sh #[email protected] #作用:mysql中show binary logs记录的二进制日志文件和实际的物理文件比较,检查 #磁盘中对应的二进制日志文件是否有丢失 source /usr/local/mysql/scripts/mysql_env.ini binlog_init=

Android APP测试的日志文件抓取

     1    log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb shell cat /proc/kmsg ,adb shell dmesg,adb shell dumpstate,adb shell dumpsys,adb bugreport,工程       模式等 2    LOG抓取详解 l  实时打印 adb logcat -b main -v

MySQL日志文件与分析

1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记录 可以指定输出为表 二进制日志 log_bin 记录可能执行更改的所有操作 mysqlbinlog查看 2.日志的分析 2.1日志的存储 数据操作过程中,Mysqld是将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中.一条一条就类似这样: # Time: 070927 8:08:

Apache access.log error.log日志文件太大优化方法

有没有发现Apache生成的日志文件一天比一天大,不是一般大,若你apache安装在C盘,那可惨了,不几天硬盘就满了,太恐怖了,有没有办法优化一下日志,让它不那么大?答案是有的. 一.停止Apache服务,删除Apache下/logs/目录中的error.log和access.log文件. 二.打开Apache的conf/httpd.conf配置文件,找到以下配置信息: ErrorLog logs/error.log CustomLog logs/access.log common 请在上述两行

云服务器 ECS Linux 系统中常见的日志文件介绍

云服务器 ECS Linux 系统中,日志文件是非常重要的文件,它们记录了很多系统中重要的事.Linux 系统中常见日志文件概述如下: /var/log/cron可以在 cron 文件中检查 crontab 任务调度是否实际执行,执行过程是否发生错误,以及 /etc/crontab 文件是否有语法错误或编写错误. /var/log/dmesg 可以在 dmesg 文件中检查系统在开机时候内核检测过程所产生的各项信息,包括系统的设备信息,以及在启动和操作过程中系统记录的任何错误和问题的信息.通过

android 中打 Log 的一些技巧

在 android 平台上搞开发工作,会经常用到一些 Log 输出调试信息. 众所周知,android 中有五种类型的 Log , v, d, i, w, e 这里就不再赘 述 (如果对这些不了解的朋友,推荐看 android_Tutor 的博文http://blog.csdn.net/Android_Tutor/article/details/5081713 , 上面讲的很详细) 本文主要讲一下如何统一控制 Log 的输出和关闭. 一般我们会在 debug 的版本中输出 log,而在 rele