一般在平时工作中,基本上很多代码可以在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

  E/ActivityManager( 957): ANR in com.ipanel.join.appstore

  E/ActivityManager( 957): Reason: Broadcast of Intent { act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.ipanel.join.appstore/.widget.SmallWidget1 (has extras) }

  E/ActivityManager( 957): Load: 1.57 / 0.38 / 0.13

  E/ActivityManager( 957): CPU usage from 6290ms to 0ms ago:

  E/ActivityManager( 957): 70% 957/system_server: 1.1% user + 69% kernel / faults: 204 minor

  E/ActivityManager( 957): 8.7% 1014/com.ipanel.join.home.jelly: 7.7% user + 0.9% kernel / faults: 899 minor

  E/ActivityManager( 957): 0.3% 687/yaffs-bg-1: 0% user + 0.3% kernel

  E/ActivityManager( 957): 0.3% 688/yaffs-bg-1: 0% user + 0.3% kernel

  E/ActivityManager( 957): 0.3% 935/irkeyservice: 0% user + 0.3% kernel

  E/ActivityManager( 957): 0% 890/galcore daemon : 0% user + 0% kernel

  E/ActivityManager( 957): 0.1% 1076/com.ipanel.join.browser: 0.1% user + 0% kernel

  E/ActivityManager( 957): 0.1% 1124/com.ipanel.join.appstore: 0.1% user + 0% kernel

  E/ActivityManager( 957): 75% TOTAL: 4.7% user + 70% kernel

  E/ActivityManager( 957): CPU usage from 622ms to 1169ms later:

  E/ActivityManager( 957): 71% 957/system_server: 0% user + 71% kernel / faults: 2 minor

  E/ActivityManager( 957): 67% 965/SurfaceFlinger: 0% user + 67% kernel

  E/ActivityManager( 957): 1.9% 973/ActivityManager: 1.9% user + 0% kernel

  E/ActivityManager( 957): 1.9% 991/CursorMove: 0% user + 1.9% kernel

  E/ActivityManager( 957): 7.6% 1014/com.ipanel.join.home.jelly: 7.6% user + 0% kernel / faults: 31 minor

  E/ActivityManager( 957): 5.7% 1119/Thread-13: 5.7% user + 0% kernel

  E/ActivityManager( 957): 1.9% 1123/Thread-13: 1.9% user + 0% kernel

  E/ActivityManager( 957): 76% TOTAL: 1.8% user + 72% kernel + 1.8% softirq

  指定哪个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:

  (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

  at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)

  at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)

  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)

  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)

  at java.net.Socket.connect(Socket.java:983)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:74)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:298)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1018)

  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726)

  at com.ipanel.join.appstore.http.DefaultHttpRequest.doGet(DefaultHttpRequest.java:35)

  at com.ipanel.join.appstore.widget.AbsSmallWidget.requestApps(AbsSmallWidget.java:117)

  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'

  E/SystemServer( 1803): Failure starting Input Manager Service

  E/SystemServer( 1803): java.lang.RuntimeException: Unable to get provider com.android.providers.settings.SettingsProvider: java.lang.ClassNotFoundException: com.android.providers.settings.SettingsProvider in loader dalvik.system.PathClassLoader[/system/app/SettingsProvider.apk]

  E/SystemServer( 1803): at 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

  查看内存: cat /proc/meminfo 发现空闲内存只剩下几M空间了。

  请加大android系统的内存即可解决问题

android死机问题的更多相关文章

  1. android 常见死机问题--log分析

    http://blog.csdn.net/fangchongbory/article/details/7645815         android 常见死机问题--log分析============ ...

  2. android 动态库死机调试方法 .

    原地址:http://blog.csdn.net/andyhuabing/article/details/7074979 这两种方法都不是我发明了,都是网上一些高手公共出来的调试方法,无奈找不到出处的 ...

  3. 在mac上运行android的intel模拟器导致的死机问题解决

    最近用Mac开发android的时候遇到了一个烦人的问题,装上了HAXM,intel hardware accelerated execution manager以后,一运行android emula ...

  4. 解决Android-studio假死机建议

    背景 终于第一个ios app发布应用商店送审了,这下也有时间把以前写的android更新一版,但是很久没遇到的as假死机问题又各种折腾了一天..最终解决的方法实在是让人忍无可忍,实在是想写下来给那些 ...

  5. APP测试点总结(功能,交互,死机崩溃状态分析,容易出错的检查点)

    APP测试点总结(功能,交互,死机崩溃状态分析,容易出错的检查点) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近涉足APP端测试,常见检查点总结如下:   一.业务方面: 1.  注册( ...

  6. 【原创】贴个dirtycow(脏牛漏洞)不死机的exploit

    dirtycow官网上几个获得rootshell的exp大都会导致机器死机,在原作者的基础上改进了一下,做个记录: /* * (un)comment correct payload first (x8 ...

  7. 在Mac系统上配置Android真机调试环境

    在Mac系统上配置Android真机调试环境 mac上配置安卓环境还说挺方便的,真机调试也比win上要好一些.win上被各种软件强行安装了xxx助手. 在mac上就了一个干净的感觉. 下载Androi ...

  8. 解决Oracle+weblogic系统死机的问题

    前段时间发布的系统(Oracle+weblogic)频繁挂掉,每天早上9点.下午2点高峰期就挂,纠结了很长时间,最终解决,方法描述下. 执行select count(*),status from v$ ...

  9. ubuntu死机怎么办

    在使用ubuntu的时候由于各种复杂的因素,如软件不兼容,误操作等问题导致"死机"怎么办呢?下面我们来看看如何解决这问题...   可以打开终端模拟器   1 ctrl+alt+t ...

随机推荐

  1. 《Java程序设计》学期总结

    <Java程序设计> 学期总结 课程设计小组 -迦瓦栈队 团队博客 读书笔记汇总 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 第十周 实验报告汇总 实验一 实验 ...

  2. Qt Charts

    简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...

  3. 如何处理PHP和MYSQL的并发以及优化

    sql优化,数据缓存和页面静态化首先各种优化程序逻辑优化数据库优化硬件横向扩展数据hash.服务器提升性能.表hash.出钱找oraclec出解决方案页面静态化:Php页面静态化有两种,第一,php模 ...

  4. hdu-------(1698)Just a Hook(线段树区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. ARM字节对齐问题详解

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  6. Idea添加Jetty时提示JMX module is not included

    添加自己的jetty时提示下图 此时,我们应该编辑jetty根目录下 start.ini 添加 "--module=jmx" 此时就可以成功添加了 原因:因为在9.07的时候默认情 ...

  7. SVG格式

    SVG格式 编辑 目 录 概述 简介 优势 实例 展现 1概述 SVG格式 SVG是一种用XML定义的语言,用来描述二维矢量及矢量/栅格图形.SVG提供了3种类型的图形对象:矢量图形(vectorgr ...

  8. 转载css层级优先级。

    解读CSS样式优先级(修改门户自定义样式必读) 一.什么是CSS优先级?所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.当同一个元素(或内容)被多个CSS选择符选中时,就要按照优先权取舍 ...

  9. 转:PHP Composer 管理工具的介绍 这个相对清晰点

    转自:http://www.aichengxu.com/view/14872 一.PHP的一些臭历史 Dependency Manager For PHP,Composer.在Composer还没诞生 ...

  10. UVALive 6680 Join the Conversation

    题意:conversion的定义是下一句提到上一句的人的名字.请你输出最长的对话的长度,及组成对话的序列号. 思路:动态规划的思想很容易想到,当前句子,根据所有提到的人的名字为结尾组成的对话长度来判断 ...