2013-07-16 83 views
11

我目前正在開發的android應用程序崩潰(修復了),由於應該引發IndexOutOfBoundsException。我從可變參數參數(即String ...)中訪問擴展AyncTask的類的doInBackground方法中的字符串。我偶然訪問了一個元素變量參數字符串的索引1(不是0)(輕度尷尬......)。當應用程序第一次崩潰時,我查看了我的logcat(並且多次再次確認我沒有發瘋),並且沒有找到RuntimeException的堆棧跟蹤。我經常碰碰我的手機,並且總是有一個很好的小堆棧跟蹤讓我查看和修復,但是我對此感到困惑。這裏是我的logcat的有關章節(不含堆棧跟蹤一個RuntimeException),下面的代碼是造成飛機墜毀前行右調試聲明:爲什麼android logcat不顯示運行時異常的堆棧跟蹤?

W/dalvikvm(25643): threadid=11: thread exiting with uncaught exception (group=0x40c281f8) 
D/dalvikvm(25643): GC_CONCURRENT freed 1249K, 25% free 12433K/16455K, paused 2ms+6ms 
W/dalvikvm(25643): threadid=15: thread exiting with uncaught exception (group=0x40c281f8) 
I/Process (25643): Sending signal. PID: 25643 SIG: 9 
I/ActivityManager(5905): Process com.trade.nav.ges (pid 25643) has died. 
W/ActivityManager(5905): Force removing r: app died, no saved state 
I/WindowManager(5905): WIN DEATH: win 
I/WindowManager(5905): WIN DEATH: win 
I/SurfaceFlinger(1746): id=3848 Removed idx=2 Map Size=4 
I/SurfaceFlinger(1746): id=3848 Removed idx=-2 Map Size=4 
I/WindowManager(5905): WIN DEATH: win 
I/power (5905): *** acquire_dvfs_lock : lockType : 1 freq : 1000000 
D/PowerManagerService(5905): acquireDVFSLockLocked : type : DVFS_MIN_LIMIT frequency : 1000000 uid : 1000 pid : 5905 tag : ActivityManager 
W/ActivityManager(5905): mDVFSLock.acquire() 

而在此之後,另一項活動開始。 作爲參考,這裏是導致崩潰的代碼:

private class LoadImage extends AsyncTask<String, Integer, Bitmap> { 
    String url = ""; 
    //... 
    public LoadImage(ImageView iv, Context c) { 
     //... 
    } 

    protected Bitmap doInBackground(String... urls) { 
     // urls has one element 
     url = urls[1]; 
     //... 
    } 
    //... 
} 

任何深入瞭解正在發生的事情會請我很大,因爲我很好奇有在互聯網上像這樣的從來沒有見過。 謝謝。

編輯:我沒有過濾器設置

+0

你試過把異常代碼放在Try Catch Block中嗎? –

+0

你確定你沒有選擇任何過濾器? – Varun

+1

...問題不是我需要防止代碼引發運行時異常,我已經在另一個版本的代碼中做了這些(將數字1更改爲0)。問題在於舊版本的代碼從未導致運行時異常堆棧跟蹤顯示在我的logcat中。我想知道爲什麼會發生。 –

回答

10

你的線程都清楚地崩潰(注意:在同一個進程中thread exiting with uncaught exception在兩個不同的線程)。該過程正在自行清理 - Sending signal表示該進程正在向其自身發送致命信號。所以問題是爲什麼你沒有看到這兩者之間的堆棧轉儲。

堆棧轉儲來自RuntimeInit$UncaughtHandler,這是框架提供的全局未捕獲異常處理程序。過程自毀發生在finally區塊中。如果沒有記錄「FATAL EXCEPTION」,很難找到擺脫這種情況的方法,除非Slog.e中的某些內容失敗並拋出。

我猜想要麼是Slog.e中的某個失敗,要麼是有人已經替換了框架的未捕獲的異常處理程序。如果您將某個外部庫合併到您的應用程序中,後者可能會發生,例如崩潰日誌捕獲器或廣告網絡,並且新處理程序不會記錄該異常但會殺死該進程。

您可以通過附加Java語言調試器(例如Eclipse)進行追蹤。默認情況下,它會停止未捕獲的異常。從那裏你可以追蹤它,通過未捕獲的異常處理程序(如果你有完整的源代碼)設置斷點和單步,等等。

+0

非常感謝。我打算在家中更多地進行調查,因爲我無法找到工作時間。我沒有任何應該影響到的第三方庫(儘管我會檢查Aviary,一個我作爲庫使用的圖像編輯器是否做了這樣的事情),而且我仍然在我的logcat中看到其他堆棧轉儲(因爲它應該是),所以我仍然很感興趣。非常感謝您提供及時的,充分了解的建議。祝你今天愉快。 –

6

根據fadden的懷疑,外部庫可以覆蓋未捕獲的異常處理程序,我開始調查任何可能的庫。結果發現GoogleAnalytics節流器崩潰,並且如果打開enableExceptionReporting,則會阻止堆棧跟蹤在logcat中顯示。我刪除這行代碼,然後一切都回到正軌!這可能是我第一次看到崩潰很高興!