Android應用Log分析入門

Android平臺提供了多種log輸出,這裏主要針對常見的幾種問題提供一些基礎的分析指南。

1. Java Crash

Java Crash是我們最爲常見的嚴重錯誤了。在Logcat中,可以找到其報錯的地方,通過其標註的位置開始調查代碼。

例如:

?
1
2
3
4
11-21 07:26:07.273 E/AndroidRuntime( 3755): FATAL EXCEPTION: main
11-21 07:26:07.273 E/AndroidRuntime( 3755): java.lang.NullPointerException
11-21 07:26:07.273 E/AndroidRuntime( 3755):     at com.csi.player.mediaCallback(SourceFile:422)
...

在這裏,log裏面已經明確說明了錯誤的類型爲"java.lang.NullPointerException", 和發現這個問題的代碼"mediaCallback.java"的422行。

常見的嚴重錯誤有如下幾類:

  • NullPointerException:  空對象錯誤
    IllegalStateException:非法狀態,比如在View沒有刷出來的時候去觸摸。
    IndexOutOfBoundsException
    IllegalArgumentException
    ExceptionInInitializerError
    ClassCastException
    RuntimeException
    UnknownFormatConversionException
    UnsupportContentTypeException
    CursorIndexOutOfBoundsException

2.ANR

ANR是一種常見的嚴重錯誤,在logcat中會直接給出造成ANR的原因,例如:

?
1
2
11-01 18:16:15.966 E/ActivityManager(  344): ANR in com.android.systemui
11-01 18:16:15.966 E/ActivityManager(  344): Reason: Broadcast of Intent { act=android.intent.action.TIME_TICK flg=0x40000014 (has extras) }

以上這個ANR就是由BroadcastTimeout引起的。

常見的ANR原因有如下:

KeyDispatchTimeout(5 seconds) Key事件響應超時
BroadcastTimeout(10 seconds) BroadcastReceiver超時
ServiceTimeout(20 seconds) Service超時

當ANR發生時,我們可以在/data/anr/下面發現響應的trace.txt裏面會有ANR的callstack,有助於我們定位問題。


3. Tombstone

tombstone一般是由Dalvik錯誤、狀態監視調試器、C層代碼以及libc的一些問題導致的。當系統發生tombstone的時候,kernel首先會上報一個嚴重的警告信號(serious signal),上層接收到之後,進程的調試工具會把進程中當時的調用棧現場保存起來,並在系統創建了data/tombstones目錄後把異常時的進程信息寫在此目錄裏面,開發者需要通過調用棧來分析整個調用流程來找出出問題的點。

這裏主要介紹一下常用的分析步驟:

 a. 首先查看日誌文件,搜索"SEGV_MAPERR" 或者 "SEGV_ACCERR",

注: SEGV_MAPERR地址沒有映射到對象,SEGV_ACCERR對映射的對象沒有權限

例如:

?
1
2
3
4
5
6
pid: 122, tid: 14745, name: Binder_2  >>> /system/bin/mediaserver <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058
    eax 00000000  ebx 41bbf784  ecx 00000000  edx 00000009
    esi 450578f0  edi 40378054
    xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007b
    eip 4088a5c2  ebp 45e15cb8  esp 45e15ca0  flags 00010297

b. 再看backtrace

?
1
2
3
4
5
6
7
 #00  pc 000085c2  /system/lib/libcameraservice.so (android::CameraHardwareInterface::__set_buffer_count(preview_stream_ops*, int)+34)
    #01  pc 0003b6fa  /system/lib/hw/camera.XXXX.so (android::PreviewThread::allocateGfxPreviewBuffers(int)+154)
    #02  pc 0003ce83  /system/lib/hw/camera.XXXX.so (android::PreviewThread::threadLoop()+1203)
    #03  pc 0001a2bc  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+556)
    #04  pc 0000dda8  /system/lib/libc.so (__thread_entry+248)
    #05  pc 0001b031  /system/lib/libc.so
    #06  pc 00001f2c  /system/lib/libc.so

從這段log來看,發現問題發生時,出錯的lib爲libcameraservice.so。

c. 如果需要進一步分析,需要動用symbol文件,具體步驟這次就不詳述了。


4. Memory Leak

在Logcat輸出中,會出現

?
1
2
3
4
5
6
7
8
9
10
E/AndroidRuntime(1112):
Caused by: java.lang.OutOfMemoryError: bitmap size
exceeds VM budget
E/AndroidRuntime(1112):
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(1112):
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:447)
E/AndroidRuntime(1112):
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
E/AndroidRuntime(1112):

這裏1112是進程的pid,代表出現OOM的應用。如果需要詳細分析,一般來說需要先製造出來hprof文件,詳細做法請參考Memaory debug


5. Kernel Panic

通過demsg命令可以查看到內核log輸出。查找kernel panic和Bug等字樣就能找到。





發佈了132 篇原創文章 · 獲贊 17 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章