android bug定位

轉自: http://swverification.blog.sohu.com/141315680.html


對於android上的bug定位的文檔很少,因爲應用程序千差萬別的,出現的問題也不盡相同,不過也是有規律可循,大的方向定位是可以做到的,我們對應用程上的問題可以得到相關的信息。

    首先,要對Java的Throwable比較熟悉,因爲Android上的應用和服務都是Java的代碼,它的Error和Exception都是沿用Java的,比如Error有AssertionError,VirtualMachineError,OutOfMemoryError和其他的Error類。Exception有RuntimeException和IOException,請參考相應的文檔查詢,Adb logcat裏面會把出現錯誤的Error或Exception打印出來。

    分類1, 應用程序錯誤,什麼樣子的?大家如果用過android手機會碰到過xxxx process意外停止,Force close的對話框彈出來。這一般都是應用程序錯誤。這個過程一般有uncaughtException,crash(TAG,e),handleApplicationError,sendSingal(SIGQUIT),logThreadStacks然後會在/data/anr/traces.txt追加process crash信息。

    舉例:

    11-04 08:55:37.114 W/AudioFlinger( 1032): write blocked for 55 msecs
11-04 08:55:37.334 W/dalvikvm( 1103): threadid=35: thread exiting with uncaught exception (group=0x2aadda08)
11-04 08:55:37.354 E/AndroidRuntime( 1103): Uncaught handler: thread WindowManagerPolicy exiting due to uncaug
ht exception
11-04 08:55:37.374 E/AndroidRuntime( 1103): *** EXCEPTION IN SYSTEM PROCESS.  System will crash.
11-04 08:55:37.394 I/global  ( 1566): Default buffer size used in BufferedReader constructor. It would be bett
er to be explicit if an 8k-char buffer is required.
11-04 08:55:37.464 E/AndroidRuntime( 1103): java.lang.NullPointerException
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at android.graphics.Canvas.throwIfRecycled(Canvas.java:954)
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at android.graphics.Canvas.drawBitmap(Canvas.java:980)
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at com.android.internal.policy.impl.UnlockSliderView$AbstractView
State.drawCanalBmp(UnlockSliderView.java:851)
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at com.android.internal.policy.impl.UnlockSliderView$AbstractView
State.drawSlideCanalBmp(UnlockSliderView.java:822)
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at com.android.internal.policy.impl.UnlockSliderView$ViewStateSli
ding.drawSlideImage(UnlockSliderView.java:1798)
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at com.android.internal.policy.impl.UnlockSliderView$ViewStateSli
ding.onDraw(UnlockSliderView.java:1766)
11-04 08:55:37.464 E/AndroidRuntime( 1103):  at com.android.internal.policy.impl.UnlockSliderView.onDraw(Unloc
kSliderView.java:507)

    分類2,Java application Hang,當應用程序停止響應事件比如按鍵/Touch的時候,會諸如如下流程,broadcastTimeout,appNotRespondingLocked(frameworks/base/services/java/com/android/server/am/ActivityManagerService.java),sendSingal(SIGQUIT)(frameworks/base/core/java/android/os/Process.java),SingalCatcherThreadStart(dalvik/vm/SignalCatcher.c),logThreadStacks() (dalvik/vm/SignalCatcher.c)然後會在/data/anr/traces.txt追加process crash信息。

    舉例:

11-04 15:02:00.795 I/dalvikvm( 1270): processname:com.android.phone
11-04 15:02:00.795 I/dalvikvm( 1270): crashstring:Java Crash/Hang (SIGQUIT)
11-04 15:02:00.795 I/dalvikvm( 1270): crashlog:

    其他的android錯誤,通常開發人員會用Log.e來甄別這些信息。

    

    Dalvik/ Core Libraries的錯誤

    類似於01-06 17:27:24.526: INFO/DEBUG(963): crashlog:
01-06 17:27:24.526: INFO/DEBUG(963): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-06 17:27:24.526: INFO/DEBUG(963): Build fingerprint: 'xxxxbuild/test-
keys'
01-06 17:27:24.526: INFO/DEBUG(963): pid: 2539, tid: 2539  >>> /system/bin/vold <<<
01-06 17:27:24.526: INFO/DEBUG(963): signal 11 (SIGSEGV), fault addr 00000000
01-06 17:27:24.526: INFO/DEBUG(963):  r0 00000000  r1 00020000  r2 00000000  r3 80808080
01-06 17:27:24.526: INFO/DEBUG(963):  r4 00000000  r5 00000000  r6 beff7490  r7 000111cc
01-06 17:27:24.526: INFO/DEBUG(963):  r8 00000000  r9 00000000  10 00000000  fp 00000000
01-06 17:27:24.526: INFO/DEBUG(963):  ip 00000000  sp beff7468  lr 0000a6c1  pc afe0e1b8  cpsr 40000010
01-06 17:27:24.576: INFO/DEBUG(963):          #00  pc 0000e1b8  /system/lib/libc.so
01-06 17:27:24.576: INFO/DEBUG(963):          #01  pc 0000a6be  /system/bin/vold
01-06 17:27:24.576: INFO/DEBUG(963):          #02  pc 0000a858  /system/bin/vold
01-06 17:27:24.576: INFO/DEBUG(963):          #03  pc 0000a918  /system/bin/vold
01-06 17:27:24.586: INFO/DEBUG(963):          #04  pc 000097b2  /system/bin/vold
01-06 17:27:24.586: INFO/DEBUG(963):          #05  pc 0001fd7a  /system/lib/libc.so
01-06 17:27:24.586: INFO/DEBUG(963):          #06  pc 0000bcd2  /system/lib/libc.so
01-06 17:27:24.586: INFO/DEBUG(963):          #07  pc b000157e  /system/bin/linker
01-06 17:27:24.586: INFO/DEBUG(963): code:
01-06 17:27:24.586: INFO/DEBUG(963):  afe0e1a8  
01-06 17:27:24.586: INFO/DEBUG(963):  e3120003
01-06 17:27:24.586: INFO/DEBUG(963):  e28cc001

    。。。

    具體調用過程__linker_init()  (bionic/linker/linker.c) -> debugger_init() (bionic/linker/debugger.c)-> debugger_signal_handler()Called when a signal is received from Kernel, uses socket() to connect to The “android:debuggerd” socket, and write()s to the socket    -> main()(system/core/debuggerd/debuggerd.c)The debuggerd daemon creates a socket server android:debuggerd and loops forever,waiting for some client to write into the socket  -> handle_crashing_process()->engrave_tombstone() (system/core/debuggerd/debuggerd.c)Dump stack trace and registers in /data/tombstone/ folder在/data/tombstone/會看到這些東西

    

    kernel錯誤:比較難定位,如果系統發生crash現象,可以開機之後取得最後一次的kernel日誌來定位,可以在/proc/last_kmsg得到相關的東西來定位系統是不是kernel問題。在日誌裏面通常最後會有Kernel panic 。。。。

    Modem的問題,這個跟平臺有關係,比如G1是高通平臺,如果發生在Modem的問題crash了,你可以到/proc/last_amsslog 找到,發給高通解決。比如從/proc/last_kmsg得到

05-29 09:09:02.409 <0>[54026.002654] Kernel panic - not syncing: Modem has crashed... 這樣可以定位到modem的問題,找到/proc/last_amsslog 相關信息,不過這個是二進制文件的。

 

總結:如果是用戶程序Exception或者Dalvik Error Invoking Runtime都會通過AcitivityMangerService發出SIGQUIT信號給process,再調用SignalCatcher.c再把crashed process信息放在/data/anr/traces.txt裏面。

如果是SYSTEM process????或者通過Log.e(TAG,str,trowable)會直接報告exception到logcat裏面。

如果是Dalvik Error, Invoking debuggerd/C code/LibC Error, 會調用Tombstone,然後把信息打印到/data/tombstones目錄裏面。

如果是kernel錯誤,會直接放到/proc/last_kmsg文件(下次重啓後會有)

如果是Modem錯誤,會直接有/proc/last_amass文件出現(高通平臺)。

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