一般在平时工作中,基本上很多代码可以在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. maven工程打包成runnable的jar包,拷贝资源和依赖jar包

    eclipse下新建maven工程,生成runnable的jar包.之前一直是手动拷贝依赖的jar包和资源文件,烦得要死.上网可劲查了一下.解决方案如下. 在pom的配置文件中做如下配置: <b ...

  2. CSDN中的Bug

    简述 在用CSDN的过程中,发现了许许多多的Bug.之前没有做记录,直接反馈给客服了,有时没图说得不太清楚,现在不都追求有图有真相么O(∩_∩)O~,所以在此记录一下. 作为程序员的一份子,Bug对我 ...

  3. JavaWeb基础: Web应用和Web服务器

    Web Server工作原理 假设工程师想提供一个网页浏览的Web应用给客户,需要经过以下几步: 在指定目录下新建资源(hello.html) 编写一个服务器ServerDemo监听请求和响应请求:S ...

  4. hdu---1024Max Sum Plus Plus(动态规划)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. eclipse hibernate 插件测试1

    今天先测试了hibernate tools 安装 在eclipse marketplace里面搜索 hibernate tools 就能找到 网上很多文章所说的使用 install new softw ...

  6. 更准确的mysql全文索引

    MYSQL自带的全文索引在查找数据的时候,有非常多的限制,如字符少于3个不能搜索,常用字不能搜索 但mysql 的like进行查询的时候又非常的慢 但你需要用到比较准确的查询的时候,要么不用mysql ...

  7. javamail 学习及实例

    JavaMail,是Sun发布的用来处理email的API,提供给开发者处理电子邮件相关的编程接口.通过使用它可以方便地执行一些常用的邮件传输. 可以看下<java邮件开发详解>第四章和第 ...

  8. cms3.0——收获(1)

    或许是由于各个公司的情况不同,使得每次写后台管理系统就沿用之前的nodejs中的thinkjs来写后台管理系统,也是因为这样后期维护起来更加方便吧?不过最早之前的项目,却有一个使用的是nodejs 中 ...

  9. C#入门篇6-9:字符串操作 不值一提的函数【不看也行】

    // 判断输入的是否全是数字:返回结果:true:全是数字:false:有字幕出现 public static bool Isaccord1(string str) { bool bl = true; ...

  10. 在Html中使用JavaScript的几点小结

    前言 越发的意识到JS这门作为前端语言的重要性.所以下定决心这段时间在项目允许的情况下花大量时间在学习JS上.争取让自己的前端功底深厚一点. 小结 在包含外部js文件时,必须将src属性设置为指向相应 ...