如何读懂和分析Android的logcat以及stack traces

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何读懂和分析Android的logcat以及stack traces相关的知识,希望对你有一定的参考价值。

  一般在平时工作中,基本上很多代码可以在eclipse+ndk进行调试,但如果需要用到具体的硬件设备,如媒体播放设备无法模拟的情况下,只能上硬件(盒子或手机)上进行调试。此时唯一的调试手段就是logcat产生log信息进行分析问题了。
  什么时候会有Log文件的产生 ?一般在如下几种情况会产生log文件 。
  1、程序异常退出 uncaused exception
  2、程序强制关闭 Force Closed (简称FC)
  3、程序无响应 Application No Response(简称ANR),一般主线程超过5秒么有处理就会ANR
  4、手动生成
  进入控制台输入:logcat命令即可进行输出
  第一部分
  1、分析工具介绍
  a、cat /proc/meminfo 显示基本的内存信息
  ------ MEMORY INFO (/proc/meminfo) ------
  MemTotal: 285184 kB
  MemFree: 106360 kB
  Buffers: 0 kB
  Cached: 60036 kB
  SwapCached: 0 kB
  Active: 98160 kB
  Inactive: 49100 kB
  Active(anon): 87260 kB
  Inactive(anon): 288 kB
  Active(file): 10900 kB
  Inactive(file): 48812 kB
  Unevictable: 0 kB
  Mlocked: 0 kB
  SwapTotal: 0 kB
  SwapFree: 0 kB
  Dirty: 0 kB
  Writeback: 0 kB
  AnonPages: 87240 kB
  Mapped: 26500 kB
  Shmem: 324 kB
  Slab: 13340 kB
  SReclaimable: 1672 kB
  SUnreclaim: 11668 kB
  KernelStack: 2160 kB
  PageTables: 5600 kB
  NFS_Unstable: 0 kB
  Bounce: 0 kB
  WritebackTmp: 0 kB
  CommitLimit: 142592 kB
  Committed_AS: 1065600 kB
  VmallocTotal: 417792 kB
  VmallocUsed: 137700 kB
  VmallocChunk: 254980 kB
  重点关注这下面几个值:
  MemTotal: 285184 kB //总计物理内存的大小
  MemFree: 106360 kB //可用内存有多少
  Buffers: 0 kB //磁盘缓存内存的大小
  Cached: 60036 kB
  # free
  free
  total used free shared buffers
  Mem: 285184 178884 106300 0 0
  Swap: 0 0 0
  Total: 285184 178884 106300
  在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。
  但实际上这些内存也是可以立刻拿来使用的。
  所以空闲内存=free+buffers+cached=total-used
  还有几个命令可使用:
  /proc/meminfo 机器的内存使用信息
  /proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。
  /proc/pid/statm 进程所占用的内存
  b、查看进程信息
  ------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
  能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器
  c、android提供的一些操作工具
  ------ PROCRANK (procrank) ------
  ------ PROCMEM (procmem) ------
  ------ SHOWMAP (showmap) ------
  ... 就不一一列举了,有兴趣的朋友可以去看看
  这此工具的代码位于android的 /system/extras
  d、虚拟内存的查看工具
  ------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
  ------ VMALLOC INFO (/proc/vmallocinfo) ------
  2、时间信息,也是我们主要分析的信息
  格式如下:
  ------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
  $:logcat -b system -v time -d *:v
  01-02 08:00:02.570 I/SystemServer( 957): Notification Manager
  01-02 08:00:02.570 I/SystemServer( 957): Device Storage Monitor
  01-02 08:00:02.580 I/SystemServer( 957): Location Manager
  01-02 08:00:02.580 I/SystemServer( 957): Search Service
  01-02 08:00:02.590 I/SystemServer( 957): DropBox Service
  01-02 08:00:02.590 I/SystemServer( 957): Wallpaper Service
  3、虚拟机信息,包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。
  ------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
  ------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
  格式如下 :
  ----- pid 1516 at 1970-01-02 08:03:07 -----
  Cmd line: com.ipanel.join.appstore
  DALVIK THREADS:
  (mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
  "main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x4001f188 self=0xd028
  | sysTid=1516 nice=0 sched=3/0 cgrp=[fopen-error:2] handle=-1345017744
  第二部分
  如何分析log信息
  1、查找错误信息的关键字眼
  "error" "failxx" "E/" 等的错误信息
  将这些问题先行解决掉
  2、动态库死机
  查看类似的“Build fingerprint:”这些关键字
  I/DEBUG ( 692): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
  I/DEBUG ( 692): Build fingerprint: \'generic/generic/generic:2.3.1/GRH78/eng.userdev-rd6-input.20120221.113348:eng/test-keys\'
  I/DEBUG ( 692): pid: 694, tid: 694 >>> /system/bin/mediaserver <<<
  I/DEBUG ( 692): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000input module init -->
  010
  对于这此信息,可以查看动态库的分析:
  http://blog.csdn.net/andyhuabing/article/details/7074979
  3、解决java抛异常的问题解决
  E/UsbObserver( 957): java.lang.NullPointerException
  E/UsbObserver( 957): at com.android.server.UsbObserver.init(UsbObserver.java:131)
  E/UsbObserver( 957): at com.android.server.UsbObserver.<init>(UsbObserver.java:65)
  E/UsbObserver( 957): at com.android.server.ServerThread.run(SystemServer.java:419)
  I/SystemServer( 957): UI Mode Manager Service
  这个直接找到java代码,分析其实现即可解决
  4、ANR问题
  搜索“ANR”关键词,快速定位到关键事件信息 。
  定位到关键的事件信息如下:
  I/dalvikvm( 1014): Wrote stack traces to \'/data/anr/traces.txt\'
  I/Process ( 957): Sending signal. PID: 1124 SIG: 9

  指定哪个java包出问题
  E/ActivityManager( 957): ANR in com.ipanel.join.appstore
  进程号为957发生了如下错误:com.ipanel.join.appstore 包下面 Broadcast问题
  ANR原因:
  E/ActivityManager( 957): Reason: Broadcast of Intent act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.ipanel.join.appstore/.widget.SmallWidget1 (has extras)
  这是ANR的堆栈调用文件
  I/dalvikvm( 1014): Wrote stack traces to \'/data/anr/traces.txt\'
  通过上面的log信息分析,应该是接收一个广播消息时超时了
  我们再分析虚拟机信息 ,打开/data/anr/traces.txt,可有通过adb pull /data/anr/traces.txt .
  这里每一段都是一个线程 ,当然我们还是看线程号为1的主线程了。通过分析发现关键问题是这样:
  搜索“DALVIK THREADS”关键词,快速定位到本应用程序的虚拟机信息日志
  ----- pid 1516 at 1970-01-02 08:03:07 -----
  Cmd line: com.ipanel.join.appstore
  DALVIK THREADS:
。。。
  at com.ipanel.join.appstore.widget.AbsSmallWidget.getRemoteViews(AbsSmallWidget.java:56)
  其实从这句话:
  at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
  基本上确认是 socket ->connect 连接超时了,导致主线程5s内没有响应从而产生ANR错误。默认的connect连接timeout时间是75s
  其实解决办法就是利用非阻塞方式进行连接即可。
  从CPU占用率上也可以看出是在kernel中执行堵塞住了
  E/ActivityManager( 957): 75% TOTAL: 4.7% user + 70% kernel
  5、执行DexOpt错误
  W/dalvikvm( 1803): DexOpt: --- END \'SettingsProvider.apk\' --- status=0x000a, process failed
  E/dalvikvm( 1803): Unable to extract+optimize DEX from \'/system/app/SettingsProvider.apk\'
。。。。android.app.ActivityThread.installProvider(ActivityThread.java:3557)

  E/SystemServer( 1803): at android.app.ActivityThread.getProvider(ActivityThread.java:3356)
  从上面的打印看,是在解压或优化extract+optimize DEX的apk文件时出错了
  1、没有出现magic number错误,这个原因与原子操作无关(这是一快速的加锁和解锁的轻量级操作函数)
  2、执行dexopt出错
  查明是服务器硬盘没空间了,导致引导文件系统的时候没有空间进行解压而失败
  6、系统启动后默认其妙或随机死机情况
  出现这种错误:
  12-01 08:11:56.027: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:11:57.315: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:11:59.318: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:12:03.332: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:12:05.329: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:12:07.216: WARN/KeyCharacterMap(312): No keyboard for id 0
  12-01 08:12:07.216: WARN/KeyCharacterMap(312): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
参考技术A 基本上很多代码可以在eclipse+ndk进行调试,但如果需要用到具体的硬件设备,如媒体播放设备无法模拟的情况下,只能上硬件(盒子或手机)上进行调试。此时唯一的调试手段就是logcat产生log信息进行分析问题了。
  什么时候会有Log文件的产生 ?一般在如下几种情况会产生log文件 。
  1、程序异常退出 uncaused exception
  2、程序强制关闭 Force Closed (简称FC)
  3、程序无响应 Application No Response(简称ANR),一般主线程超过5秒么有处理就会ANR
  4、手动生成
  进入控制台输入:logcat命令即可进行输出
  第一部分
  1、分析工具介绍
  a、cat /proc/meminfo 显示基本的内存信息
  ------ MEMORY INFO (/proc/meminfo) ------
  MemTotal: 285184 kB
  MemFree: 106360 kB
  Buffers: 0 kB
  Cached: 60036 kB
  SwapCached: 0 kB
  Active: 98160 kB
  Inactive: 49100 kB
  Active(anon): 87260 kB
  Inactive(anon): 288 kB
  Active(file): 10900 kB
  Inactive(file): 48812 kB
  Unevictable: 0 kB
  Mlocked: 0 kB
  SwapTotal: 0 kB
  SwapFree: 0 kB
  Dirty: 0 kB
  Writeback: 0 kB
  AnonPages: 87240 kB
  Mapped: 26500 kB
  Shmem: 324 kB
  Slab: 13340 kB
  SReclaimable: 1672 kB
  SUnreclaim: 11668 kB
  KernelStack: 2160 kB
  PageTables: 5600 kB
  NFS_Unstable: 0 kB
  Bounce: 0 kB
  WritebackTmp: 0 kB
  CommitLimit: 142592 kB
  Committed_AS: 1065600 kB
  VmallocTotal: 417792 kB
  VmallocUsed: 137700 kB
  VmallocChunk: 254980 kB
  重点关注这下面几个值:
  MemTotal: 285184 kB //总计物理内存的大小
  MemFree: 106360 kB //可用内存有多少
  Buffers: 0 kB //磁盘缓存内存的大小
  Cached: 60036 kB
  # free
  free
  total used free shared buffers
  Mem: 285184 178884 106300 0 0
  Swap: 0 0 0
  Total: 285184 178884 106300
  在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。
  但实际上这些内存也是可以立刻拿来使用的。
  所以空闲内存=free+buffers+cached=total-used
  还有几个命令可使用:
  /proc/meminfo 机器的内存使用信息
  /proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。
  /proc/pid/statm 进程所占用的内存
  b、查看进程信息
  ------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
  能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器
  c、android提供的一些操作工具
  ------ PROCRANK (procrank) ------
  ------ PROCMEM (procmem) ------
  ------ SHOWMAP (showmap) ------
  ... 就不一一列举了,有兴趣的朋友可以去看看
  这此工具的代码位于android的 /system/extras
  d、虚拟内存的查看工具
  ------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
  ------ VMALLOC INFO (/proc/vmallocinfo) ------
  2、时间信息,也是我们主要分析的信息
  格式如下:
  ------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
  $:logcat -b system -v time -d *:v
  01-02 08:00:02.570 I/SystemServer( 957): Notification Manager
  01-02 08:00:02.570 I/SystemServer( 957): Device Storage Monitor
  01-02 08:00:02.580 I/SystemServer( 957): Location Manager
  01-02 08:00:02.580 I/SystemServer( 957): Search Service
  01-02 08:00:02.590 I/SystemServer( 957): DropBox Service
  01-02 08:00:02.590 I/SystemServer( 957): Wallpaper Service
  3、虚拟机信息,包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。
  ------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
  ------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
  格式如下 :
  ----- pid 1516 at 1970-01-02 08:03:07 -----
  Cmd line: com.ipanel.join.appstore
  DALVIK THREADS:
  (mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
  "main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x4001f188 self=0xd028
  | sysTid=1516 nice=0 sched=3/0 cgrp=[fopen-error:2] handle=-1345017744
  第二部分
  如何分析log信息
  1、查找错误信息的关键字眼
  "error" "failxx" "E/" 等的错误信息
  将这些问题先行解决掉
  2、动态库死机
  查看类似的“Build fingerprint:”这些关键字
  I/DEBUG ( 692): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
  I/DEBUG ( 692): Build fingerprint: 'generic/generic/generic:2.3.1/GRH78/eng.userdev-rd6-input.20120221.113348:eng/test-keys'
  I/DEBUG ( 692): pid: 694, tid: 694 >>> /system/bin/mediaserver <<<
  I/DEBUG ( 692): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000input module init -->
  010
  对于这此信息,可以查看动态库的分析:
  http://blog.csdn.net/andyhuabing/article/details/7074979
  3、解决java抛异常的问题解决
  E/UsbObserver( 957): java.lang.NullPointerException
  E/UsbObserver( 957): at com.android.server.UsbObserver.init(UsbObserver.java:131)
  E/UsbObserver( 957): at com.android.server.UsbObserver.<init>(UsbObserver.java:65)
  E/UsbObserver( 957): at com.android.server.ServerThread.run(SystemServer.java:419)
  I/SystemServer( 957): UI Mode Manager Service
  这个直接找到java代码,分析其实现即可解决
  4、ANR问题
  搜索“ANR”关键词,快速定位到关键事件信息 。
  定位到关键的事件信息如下:
  I/dalvikvm( 1014): Wrote stack traces to '/data/anr/traces.txt'
  I/Process ( 957): Sending signal. PID: 1124 SIG: 9

  指定哪个java包出问题
  E/ActivityManager( 957): ANR in com.ipanel.join.appstore
  进程号为957发生了如下错误:com.ipanel.join.appstore 包下面 Broadcast问题
  ANR原因:
  E/ActivityManager( 957): Reason: Broadcast of Intent act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.ipanel.join.appstore/.widget.SmallWidget1 (has extras)
  这是ANR的堆栈调用文件
  I/dalvikvm( 1014): Wrote stack traces to '/data/anr/traces.txt'
  通过上面的log信息分析,应该是接收一个广播消息时超时了
  我们再分析虚拟机信息 ,打开/data/anr/traces.txt,可有通过adb pull /data/anr/traces.txt .
  这里每一段都是一个线程 ,当然我们还是看线程号为1的主线程了。通过分析发现关键问题是这样:
  搜索“DALVIK THREADS”关键词,快速定位到本应用程序的虚拟机信息日志
  ----- pid 1516 at 1970-01-02 08:03:07 -----
  Cmd line: com.ipanel.join.appstore
  DALVIK THREADS:
。。。
  at com.ipanel.join.appstore.widget.AbsSmallWidget.getRemoteViews(AbsSmallWidget.java:56)
  其实从这句话:
  at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
  基本上确认是 socket ->connect 连接超时了,导致主线程5s内没有响应从而产生ANR错误。默认的connect连接timeout时间是75s
  其实解决办法就是利用非阻塞方式进行连接即可。
  从CPU占用率上也可以看出是在kernel中执行堵塞住了
  E/ActivityManager( 957): 75% TOTAL: 4.7% user + 70% kernel
  5、执行DexOpt错误
  W/dalvikvm( 1803): DexOpt: --- END 'SettingsProvider.apk' --- status=0x000a, process failed
  E/dalvikvm( 1803): Unable to extract+optimize DEX from '/system/app/SettingsProvider.apk'
。。。。android.app.ActivityThread.installProvider(ActivityThread.java:3557)

  E/SystemServer( 1803): at android.app.ActivityThread.getProvider(ActivityThread.java:3356)
  从上面的打印看,是在解压或优化extract+optimize DEX的apk文件时出错了
  1、没有出现magic number错误,这个原因与原子操作无关(这是一快速的加锁和解锁的轻量级操作函数)
  2、执行dexopt出错
  查明是服务器硬盘没空间了,导致引导文件系统的时候没有空间进行解压而失败
  6、系统启动后默认其妙或随机死机情况
  出现这种错误:
  12-01 08:11:56.027: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:11:57.315: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:11:59.318: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:12:03.332: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:12:05.329: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
  12-01 08:12:07.216: WARN/KeyCharacterMap(312): No keyboard for id 0
  12-01 08:12:07.216: WARN/KeyCharacterMap(312): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

如何使用android中的logcat调试程序

Android开发中,所的有输出都在logcat中 包含System.out输出和printStackTrace()输出都在Logcat中,Android开发,建议使用android提供的Log工具类来打印信息。
找到Logcat视图的方式:
1. Eclipse 点击 Window。
2. Show View会出来一个对话框。
3. 点击最下面的other...选项。
4. 在弹出的界面中点开Android,在列表中选择logcat。
5. 点击Ok按钮时,会在控制台窗口出现LogCat视图。

android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。
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错误,这里仅显示红色的错误信息,这些错误就需要认真的分析,查看栈的信息了。
参考技术A 开发方式,在eclipse中的windows中的sh...
1

使用方法,可以使用Log.i("exp",e.toSt...
2

然后,查看logcat中的tag,和text描述...
3

当然这只是最简单的使用,一般调试信息...
4

在这里我们可以对于tag赋值,然后查看.本回答被提问者采纳

以上是关于如何读懂和分析Android的logcat以及stack traces的主要内容,如果未能解决你的问题,请参考以下文章

Android 日志系统分析(三):logcat

一文读懂 Android FFmpeg 视频解码过程与实战分析

Android 内存分析工具 - LogCat GC

DDMS的logcat不输出日志怎么解决

五分钟带你读懂UML类图

全网独有一张图读懂如何解决Android ANR故障