簡體   English   中英

為什么android logcat沒有顯示運行時異常的堆棧跟蹤?

[英]Why does android logcat not show the stack trace for a runtime exception?

我正在開發的一個Android應用程序崩潰(修復了),因為應該引發一個IndexOutOfBoundsException。 我正在從變量arguments參數(即String ...)擴展AyncTask的類的doInBackground方法中訪問一個字符串。 我不小心訪問了一個元素變量參數字符串的索引1(而不是0)(有點令人尷尬......)。 當應用程序第一次崩潰時,我查看了我的logcat,(並且多次再次確認我並非瘋狂)並且沒有找到RuntimeException的堆棧跟蹤。 我經常碰到我的手機,總是有一個很好的小堆棧跟蹤供我查看並修復,但我很困惑。 這是我的logcat的相關部分(其中不包含runtimeexception的堆棧跟蹤),緊跟在導致崩潰的代碼行之前的調試語句之后:

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];
        //...
    }
    //...
}

任何有關正在發生的事情的見解都會讓我高興,因為我很好奇從未在互聯網上看到過這樣的事情。 謝謝。

編輯:我沒有過濾器設置

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

堆棧轉儲來自RuntimeInit $ UncaughtHandler ,它是框架提供的全局未捕獲異常處理程序。 過程自我毀滅發生在finally塊中。 除非記錄Slog.e某些Slog.e失敗並拋出,否則很難看到在沒有記錄“FATAL EXCEPTION”的情況下擺脫這種情況的方法。

我猜想Slog.e某個東西是失敗的,或者有人替換了框架的未捕獲的異常處理程序。 如果您已將一些外部庫合並到您的應用程序中,例如崩潰日志捕獲器或廣告網絡,則后者可能會發生,並且新處理程序不會記錄異常但會終止該過程。

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

根據fadden的懷疑外部庫可以覆蓋未捕獲的異常處理程序,我開始研究任何可能的libs。 事實證明,如果啟用enableExceptionReportingGoogleAnalytics限制崩潰並阻止堆棧跟蹤顯示在logcat中。 我刪除了這行代碼,然后一切都恢復正常! 這可能是我第一次看到崩潰這么開心!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM