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

http://blog.csdn.net/fangchongbory/article/details/7645815

android 常见死机问题--log分析
=================================================================================================== 一般在平时工作中,基本上很多代码可以在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系统的内存即可解决问题

还有一种情况是实现gralloc模块时有死锁的情况,请查明即可。

时间: 2024-10-07 03:36:24

android 常见死机问题--log分析的相关文章

linux系统死机分析及解决方法

一.常见死机原因 二.日志分析 日志系统,通过rsyslog.service服务进行控制,分别用于记录系统内核和各应用程序的日志信息.配置文件/etc/rsyslog.conf /var/log/messages    记录系统内核消息及各种应用程序的公共日志信息,包括启动.IO错误.网络错误.程序报错等,对于未使用独立日志文件的应用程序或服务,一般都可以从该文件获得相关事件的日志记录信息. /var/log/cron    记录crond计划任务产生的事件消息 /var/log/dmesg  

Android常见漏洞

Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏洞描述: 漏洞可导致中间人攻击 修改建议: 建议不要忽略ssl认证错误 漏洞名称: sql注入漏洞 漏洞描述: 漏洞可能导致用户数据库中的信息泄露或者篡改 修改建议: 建议使用安全sqlite,如sqlcipher 漏洞名称: https空校验漏洞 漏洞描述: 漏洞可导致中间人攻击 修改建议: se

电脑死机故障分析

电脑死机故障分析 每个使用过电脑的人恐怕都遇到过死机现象,电脑的死机确实是一件很烦人的事,有时还会给您带来不小的损失,但是这个问题也确实是很复杂的,死机既有可能是硬件上的暇弊,也有可能是软件中的bug,当然还有可能就是您的"非法操作".下面想就一些实例来具体问题具体分析一番: 显卡原因 Q 一台电脑发生经常性的死机现象,启动电脑,会有三声报警声,显示器有时不能点亮,但主机工作正常,在设置成32位色彩后,死机更加频繁.为什么? A 造成以上情况死机的原因可能有两个:一个是显示卡散热不好造

分析电脑死机的常见的几种原因,以及对应的解决方法

很多的电脑用户都遇到过各种各样的电脑故障,例如花屏.黑屏.又或者是电脑无法开机.死机等等都是比较常见的故障,为了修好电脑,我们今天就来了解下,当电脑经常死机,我们用什么方法解决呢?下面就跟随小编一起来看下吧.造成电脑死机的因素有哪些呢,小编咨询了一些精通电脑维修技术的大手子,也在网上查询了许多相关的资料,并结合我自己遇到的死机的情况,来给大家谈谈导致电脑死机的四大因素,并在每个因素中讲解了具体的解决办法和注意事项,希望能帮到更多的朋友,让电脑不再受到各种故障的困扰,也不必花大价钱去电脑城维修.

android 动态库死机调试方法 .

原地址:http://blog.csdn.net/andyhuabing/article/details/7074979 这两种方法都不是我发明了,都是网上一些高手公共出来的调试方法,无奈找不到出处的地方了,所以就在此总结一下,以方便android下的调试: 简要说明: android系统中调试Java非常容易,一般遇到错误都在logcat中打印出错时函数的调用关系,而C库中出错时只看到一些二进制信息,使用gdbserver调试环境搭建又比较复杂. 方法一:下在介绍一个简单的调试库的方法,当然需

Android黑屏死机--充电运行土豆视频【.4.4】》播放视频中黑屏死机》手动按电源键开机显示电量为6%

[测试版本] T0405 [测试模块] [测试步骤] 充电运行土豆视频[.4.4]> [测试结果]播放视频中黑屏死机>手动按电源键开机显示电量为6%[开机后恢复] [预期结果]可正常播放 分析: 从测试提供的描述突然黑屏死机,并且是在电量低的情况,也有可能是直接掉电了,下面就来分析下log 从第二份last_kmsg LOG 中可以明显的看到: [ 206.423069]<0>.(0)[160:kpoc_charger]******** MT auxadc driver shutd

Android NDK 开发(三)--常见错误锦集合Log的使用【转】

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错

Log中&#39;main&#39;, &#39;system&#39;, &#39;radio&#39;, &#39;events&#39;以及android log分析

在Android中不同的log写到不同的设备中,共有/dev/log/system, /dev/log/main, /dev/log/radion, /dev/log/events四中类型.其中默认Log.v等写入/dev/log/main中.Slog写入/dev/log/system中. 我们在使用logcat 抓去日至的时候, 可以指定buffer,来请求不同的环形缓冲区 ('main', 'system', 'radio', 'events',默认为"-b main -b system&q

Android NDK开发(三)——常见错误集锦以及LOG使用

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错