androidclosed-九游会j9娱乐平台
⑴ 如何分析android的log
1、如何在程序中打出log 以及log的分類區別 ?
verbose、debug、info、warning、error
2、給你一個log文件,如何定位到問題所在?
1)如果是anr問題 , 則搜索「anr」關鍵詞 。 快速定位到關鍵事件信息 。
2)如果是forceclosed 和其它異常退出信息,則搜索"fatal" 關鍵詞, 快速定
位到關鍵事件信息 。
3)定位到關鍵事件信息後 , 如果信息不夠明確的,再去搜索應用程序包的虛擬
機信息 ,查看具體的進程和線程跟蹤的日誌,來定位到代碼 。
用這種方法,出現問題,根本不需要斷點調試 , 直接定位到問題,屢試不爽 。
下面,我們就開始來分析這個例子的log 。
(打開log文件 , 由於是anr錯誤,因此搜索"anr " , 為何要加空格呢,你加上
和去掉比較一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的無效信息 。)
3、何時會產生anr ?
1)界面操作(點擊按鈕):系統響應時間超過5秒
2)handlemessage:處理時間超過10秒
4、log文件存在的目錄?
一般在data/log目錄下(真機才有)
5、一般哪幾種情況會產生log文件 ?
1)程序異常退出 , uncaused exception
2)程序強制關閉 ,force closed (簡稱fc)
3)程序無響應 , application no response (簡稱anr)
⑵ 如何讀懂和分析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 mole 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.
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