轉:原文:https://blog.csdn.net/a136332462/article/details/76066909
一、一般測試結果分析-搜索關鍵字:
1、無響應問題可以在日志中搜索 “ANR” 。
2、崩潰問題搜索 “CRASH” 。
3、內存泄露問題搜索"GC"(需進一步分析)。
4、異常問題搜索 “Exception”(如果出現空指針, NullPointerException,需格外重視)。
詳細說明
1、 ANR問題:在日志中搜索“ANR”(“Application Not Responding"),說明有bug,出現ANR,一般是主線程的響應超過5秒,或者BroadcastReceiver沒有在10秒內作出響應。這個就是一個比較嚴重的缺陷。把耗時的操作另起線程來處理就可以了。
2、 崩潰問題:在日志中搜索“Exception”
二. 詳細分析monkey日志:
將執行Monkey生成的log,從手機中導出並打開查看該log;在log的最開始都會顯示Monkey執行的seed值、執行次數和測試的包名。
首先我們需要查看Monkey測試中是否出現了ANR或者異常,具體方法如上述。然后我們要分析log中的具體信息,方法如下:
查看log中第一個Switch,主要是查看Monkey執行的是那一個Activity,譬如下面的log中,執行的是com.tencent.smtt.SplashActivity,在下一個swtich之間的,如果出現了崩潰或其他異常,可以在該Activity中查找問題的所在。
:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end
// Allowing start of Intent {act=android.intent.action.MAIN cat=
[android.intent.category.LAUNCHER]cmp=com.tencent.smtt/.SplashActivity } in package com.tencent.smtt
在下面的log中,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表當前執行了一個單擊的操作;
Sleeping for 500 milliseconds這句log是執行Monkey測試時,throttle設定的間隔時間,每出現一次,就代表一個事件。
SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表當前執行了一個點擊下導航鍵的操作;
Sending Pointer ACTION_MOVE 代表當前執行了一個滑動界面的操作。
:Sending Pointer ACTION_DOWN x=47.0 y=438.0
:Sending Pointer ACTION_UP x=47.0 y=438.0Sleeping for 500 milliseconds
:SendKey (ACTION_DOWN): 20 //KEYCODE_DPAD_DOWN:SendKey (ACTION_UP): 20 //KEYCODE_DPAD_DOWNSleeping for 500 milliseconds
:Sending Pointer ACTION_MOVE x=-2.0 y=3.0
:Sending Pointer ACTION_MOVE x=4.0 y=-3.0
:Sending Pointer ACTION_MOVE x=-5.0 y=-3.0
:Sending Pointer ACTION_MOVE x=3.0 y=4.0
:Sending Pointer ACTION_MOVE x=-4.0 y=1.0
:Sending Pointer ACTION_MOVE x=-1.0 y=-1.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0
如果Monkey測試順利執行完成,在log的最后,會打印出當前執行事件的次數和所花費的時間;// Monkey finished代表執行完成。Monkey執行中斷,在log的最后也能查看到當前已執行的次數。Monkey執行完成的log具體如下:
Events injected: 6000
:Dropped: keys=0 pointers=9 trackballs=0 flips=0
## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected)
// Monkey finished
三、常見問題的具體分析
1、Null指針異常
空指針異常主要是有NullPointerException異常提示,在Monkey測試過程中,該信息一般記錄在plog.log (locat中也有該信息)中。
如果Monkey命令被中斷,說明有異常信息並且有對應的打印信息,可以看到如下信息,說明幾個問題:
A、android.process.acore該進程出現異常
B、異常信息主要是由於NullPointerException引起的,也就是出現了空指針,導致了acore進程進入debug
C、具體的可以繼續分析是由哪個函數的那一行導致的,如可以從rollAnimate3dRotate.java文件中的275行查找等。
//at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
D、可能同一應用中存在多處的空指針異常,所以一旦出現空指異常后,可以分析和對比log信息,如果不一致的話,需要把新的log信息也一同添加到bug中,如果log信息一直的話,則不需要繼續補充沒有必要的log信息。
**************************************************************************
// CRASH: android.process.acore (pid 1339)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:e
ng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.NullPointerException:
// at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
// at com.android.launcher.Workspace.dispatchDraw(Workspace.java:605)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at com.android.launcher.DragLayer.dispatchDraw(DragLayer.java:258)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)
// at android.view.ViewRoot.draw(ViewRoot.java:1333)
// at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
// at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:123)
// at android.app.ActivityThread.main(ActivityThread.java:4203)
// at java.lang.reflect.Method.invokeNative(Method.java:-2)
// at java.lang.reflect.Method.invoke(Method.java:521)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
// at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 7908 of 5000000 using seed 0
2、debug異常
debug異常主要是由於應用程序本身的錯誤導致的異常。在Monkey測試過程中,該信息同樣記錄在plog.log (locat中也有該信息)中。一般情況下,出現的該問題,很可能在手動測試時也可以測試到。
A、com.android.browser該進程進入debug
B、出現的是IllegalStateException異常,該異常一般多是傳遞的參數非法或被多次調用時出現的異常
C、Bug信息提交時,詳細信息中一般應該包含如下的log信息,方便開發人員分析和定位。
************************************************************************
// CRASH: com.android.browser (pid 5683)
// Short Msg: Connection is not open
// Long Msg: java.lang.IllegalStateException: Connection is not open
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.IllegalStateException: Connection is not open
// at android.net.http.AndroidHttpClientConnection.assertOpen(AndroidHttpClien
tConnection.java:153)
// at android.net.http.AndroidHttpClientConnection.setSocketTimeout(AndroidHtt
pClientConnection.java:195)
// at android.net.http.Connection.openHttpConnection(Connection.java:364)
// at android.net.http.Connection.processRequests(Connection.java:225)
// at android.net.http.ConnectionThread.run(ConnectionThread.java:116)
** System appears to have crashed at event 34155 of 5000000 using seed 0**
3、低內存異常
低內存異常一般情況下,主要表現在出現OutOfMemoryError異常或者提示Out of memory,其后果同樣表現為拋出OutOfMemoryError異常或者是通過kill process 來殺掉部分進程以釋放內存空間,當然如果被kill點關鍵的進程的話,也就可能導致部分應用會自動的退出。出現該情況時,主要是在進行頻繁的進行大量的操作導致的,所以使用手動的方式也是可能進行重現的。
A、com.android.elastos.backup該進程出現的異常
B、出現的是OutOfMemoryError異常,該異常一般多頻繁的操作(即多次調用某個函數,存在申請變量空間未釋放)導致的
C、Bug信息提交時,詳細信息中同樣應該包含如下的log信息,方便開發人員分析和定位。
// CRASH: com.android.elastos.backup (pid 1581)
// Short Msg: bitmap size exceeds VM budget
// Long Msg: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.OutOfMemoryError: bitmap size exceeds VM budget
// at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:464)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:431)
// at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:336)
// at android.widget.AbsListView.preScaleBitmapBG(AbsListView.java:2354)
// at android.widget.AbsListView.draw(AbsListView.java:2365)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)
// at android.view.ViewRoot.draw(ViewRoot.java:1333)
// at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
// at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:123)
// at android.app.ActivityThread.main(ActivityThread.java:4203)
// at java.lang.reflect.Method.invokeNative(Method.java:-2)
// at java.lang.reflect.Method.invoke(Method.java:521)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
// at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 143290 of 100000000 using seed 0#
或者出現plog信息的最后出現如下log信息也可能存在同樣問題:
<3>[56351.640641] Out of memory: kill process 14177 (app_process) score 247872 or a child
<3>[56351.641121] Killed process 14177 (app_process)
4、操作無響應異常
操作無響應的問題,主要表現在Monkey運行過程中,出現某功能無響應,提示是否“強制關閉“或“等待“,同時會打印出相應的log信息,如下:
A、可以說明com.android.soundrecorder該進程出現的無響應
B、出現的是TimerOut異常,該異常一般出現時一般都會又keyDispatchingTimedOut提示
C、目前,uPhone手機中經常出現操作無響應的幾個模塊包括:clock、camera、soundrecorder、broser等,根據開發人員分析其他模塊也是有可能出現操作無響應的,測試過程中,請多注意。
D、出現無響應異常,一般情況下很難被修復,和發送事件的頻率也是有關系的,從質量上來要求的話,要求盡可能的減少出現操作無響應的頻率和時間。
// NOT RESPONDING: com.android.soundrecorder (pid 1931)
ANR in process: com.android.soundrecorder (last in com.android.soundrecorder)
Annotation: keyDispatchingTimedOut
CPU usage:
Load: 8.24 / 8.41 / 8.25
CPU usage from 35911ms to 83ms ago:
com.android.soundrecorder: 4% = 3% user + 0% kernel / faults: 997 minor 43 maj
or
mediaserver: 2% = 2% user + 0% kernel / faults: 267 minor 3 major
android.process.media: 2% = 0% user + 1% kernel / faults: 563 minor 194 major
system_server: 1% = 1% user + 0% kernel / faults: 1279 minor 5 major
com.cootek.touchpal: 0% = 0% user + 0% kernel / faults: 180 minor 1 major
sensorserver_ya: 0% = 0% user + 0% kernel / faults: 47 minor 1 major
mmcqd: 0% = 0% user + 0% kernel
app_process: 0% = 0% user + 0% kernel / faults: 203 minor 1 major
com.fihtdc.brservice: 0% = 0% user + 0% kernel / faults: 29 minor
kswapd0: 0% = 0% user + 0% kernel
com.android.settings: 0% = 0% user + 0% kernel / faults: 266 minor
port-bridge: 0% = 0% user + 0% kernel / faults: 19 minor
rpcrouter: 0% = 0% user + 0% kernel
com.android.mms: 0% = 0% user + 0% kernel / faults: 135 minor 8 major
TOTAL: 13% = 8% user + 4% kernel + 0% iowait
procrank:
PID Vss Rss Pss Uss cmdline
1209 35368K 25376K 15283K 14036K system_server
1342 32788K 24596K 14899K 14136K android.process.acore
……
// procrank status was 0
anr traces:
// meminfo status was 0
** System appears to have crashed at event 59034 of 5000000 using seed 0
5、其他異常
A、Restart System異常(系統重新啟動),即log信息的最后幾行會看到Restart System的打印信息,說明手機被自動的重啟或斷掉,有幾個方面的原因
1、運行過程中,存在異常手機被自動重啟
2、手機在運行過程中,進入設置中的恢復出場設置,導致手機重啟
3、其他原因,如果手機后蓋移動等
B、RuntimeException等異常,同樣的會在plog.log中可以看到相應的打印信息, java.lang.RuntimeException該問題多出現在操作無響應之后,或者是某應用的服務無法啟動或連接時,需要具體問題具體的分析
C、StaleDataException、readException等異常, 在plog.log中可以看到相應的打印信息,也會有相應的信息: android.database.StaleDataException,該信息說明android的數據庫操作出現異常, 需要具體問題具體的分析
D、IllegalArgumentException等異常,多少情況下為說明向函數傳遞了一個不正確或不合法的參數需要具體問題具體的分析
E、其他,帶補充和分析說明
說明幾點:
1、log信息的分析,希望在bug信息的簡述中能夠明確說明清楚出現的是什么異常,具體的log信息要單獨添加到詳細信息描述中,方便相關人員定位和查看。
2、buy的提交,對於Monkey測試出現的問題:
a、首先要求分析log信息
b、再次要確認該bug是否已經提交?已經提交的bug和新運行出來的問題是否一致?
c、如果不一致的話,是否屬於同一問題,如空指針異常,是的話就把該問題的log信息一起注釋到bug信息中,並添加所有的log信息
d、如果不一致的,也不屬於同一問題的話,可以提交新的bug
3、在java編程中,一般的異常都會拋出xxx Exception的信息,可以跟進xxx進行相關的判斷和分析,具體的異常則需要具體問題具體分析。
6、常見的java異常
- 算術異常類:ArithmeticExecption
- 空指針異常類:NullPointerException
- 類型強制轉換異常:ClassCastException
- 數組負下標異常:NegativeArrayException
- 數組下標越界異常:ArrayIndexOutOfBoundsException
- 違背安全原則異常:SecturityException
- 文件已結束異常:EOFException
- 文件未找到異常:FileNotFoundException
- 字符串轉換為數字異常:NumberFormatException
- 操作數據庫異常:SQLException
- 輸入輸出異常:IOException
- 違法訪問錯誤:IllegalAccessError
- 內存不足錯誤:OutOfMemoryError
- 堆棧溢出錯誤:StackOverflowError 1
四.percent相關命令控制了事件類型,如果我們不指定事件類型。生成的報告中,事件占比大致如下:
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: 25.0%
// 6: 15.0%
// 7: 2.0%
// 8: 2.0%
// 9: 1.0%
// 10: 13.0%
這里將事件分為了10種類型,分別為:
0:觸摸事件百分比,即參數--pct-touch
1:滑動事件百分比,即參數--pct-motion
2:縮放事件百分比,即參數--pct-pinchzoom
3:軌跡球事件百分比,即參數--pct-trackball
4:屏幕旋轉事件百分比,
5:基本導航事件百分比,即參數--pct-nav
6:主要導航事件百分比,即參數--pct-majornav
7:系統事件百分比,即參數--pct-syskeys
8:Activity啟動事件百分比,即參數--pct-appswitch
9:鍵盤翻轉事件百分比,即參數--pct-flip
10:其他事件百分比,即參數--pct-anyevent