2015-03-19 96 views
6

我一直在嘗試幾個月,讓我的調試器破壞我自己的代碼,沒有成功。 ZygoteInit.run()方法中的每個未捕獲異常都會中斷。如何在Android Studio中正確設置異常斷點?

這是我採取的操作列表。

  1. 新增debug { debuggable true }到我的應用程序模塊的build.gradle文件
  2. 手動添加的debuggable="true"我AndroidManifest.xml文件
  3. 經過的Any exception複選框中斷點窗口
  4. 添加了相關的類過濾器模式的Any exception斷點
    • 這會導致調試器完全跳過所有未捕獲的異常

我一直在調試通過查看logcat的堆棧跟蹤,這的確顯示堆棧跟蹤我的班。

我已經看到此版本目前&以前在stable和canary頻道的版本。

這裏有什麼我失蹤?

編輯:只是爲了澄清的人,問題是,我有「捕捉異常」框未選中。選中此框可解決我的問題。

這是我的Gradle文件的相關部分,如果它有幫助的話。

android { 
    compileSdkVersion 22 
    buildToolsVersion '22.0.0' 

    defaultConfig { 
     applicationId "com.--redacted--" 
     minSdkVersion 15 
     targetSdkVersion 22 
     versionCode 30 
     versionName "0.0.30" 
     multiDexEnabled true 
    } 
    packagingOptions { 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/beans.xml' 
    } 
    buildTypes { 
     debug { 
      debuggable true 
     } 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    dexOptions { 
     javaMaxHeapSize "4g" 
    } 
} 

這是我的斷點窗口的屏幕截圖。

Breakpoints window

+0

難道你不能只是在任何地方添加try/catch塊來縮小發生異常的位置,然後只要將代碼縮小到特定的代碼塊,就把一個斷點放入並調試代碼? – 2015-03-19 06:16:53

+0

@Fahim沒有解決我的問題。該鏈接沒有詳細提及異常斷點。 – 2015-03-19 22:05:49

+0

@DanielNugent我的代碼庫相當大。這不是一個現實的解決方案。我希望調試工具能夠像廣告一樣工作。 – 2015-03-19 22:06:29

回答

9

一對夫婦更多的事情,以確保:

  • 掛起設置爲所有
  • 通知上:
    • 有錯誤處理的定義是被抓捕捉到異常如果異常
    • 未捕獲的異常,如果沒有被處理的異常都被抓
  • 設置類過濾器來限制到只包括你的代碼,Android的代碼和Java代碼

在這裏看到更詳細的說明:https://stackoverflow.com/a/28862538/3063884

Breakpoints dialog

此方法捕獲所有引發的異常(選中「捕獲」和「未捕獲」時)。因此引發了所有的內部異常。類過濾器的規範通過排除其中的一些例外來限制這一點。例如,在上面的屏幕轉儲中,將忽略在啓動過程中頻繁發生的ClassNotFoundException

這種方法的一個小缺點是,在應用程序啓動時,可能會出現一條消息,指示「無法找到當前堆棧幀的源類」。這是因爲並非所有的源代碼都已經加載完畢。這隻會在啓動過程中發生一次,並且可以安全地忽略。另一種避免這種情況的方法是,在應用程序啓動時運行Run應用程序(而不是啓動「調試」),然後通過手動將應用程序附加到調試程序運行 - >將調試器附加到Android進程 ...或通過按下工具欄中的Attach按鈕。

+0

沒有突破捕獲的異常,沒有辦法做到這一點? – 2015-03-24 16:26:45

+0

是的 - 在上面的對話框中,取消選中通知下的「捕獲的異常」。 – CJBS 2015-03-24 16:27:19

+1

我認爲這可能是導致我無法打破自己的代碼的原因。由於Android中的所有異常都在ZygoteInit.run()中捕獲到了 – 2015-03-24 16:29:19

1

您需要調試器附加到正在運行的進程

你並不總是需要重新啓動應用程序進行調試。
要調試你已經運行的應用程序:

  1. 單擊附加調試器到Android proccess
  2. 在選擇處理窗口中,選擇設備和應用要調試器附加到
  3. 打開調試工具窗口中,單擊調試

    To view and configure the breakpoints settings, click View Breakpoints on the left side of the Debug tool window. The Breakpoints window appears, and there you could configure them.

主要有三種類型的例外:

  1. 經過execptions:其必須由代碼來處理。 這些代表可以從 處理和恢復的可避免的特殊情況。運行時異常: 代碼不需要處理。這些代表意想不到的例外情況 可以處理但不一定從中恢復。

  2. 錯誤:無需由代碼處理。這些 代表嚴重意外的異常情況,其中 不被嘗試處理。

+0

我附加到該過程,因爲我已經單擊調試圖標,並且可以在運行應用程序時停止在方法斷點處。 – 2015-03-24 16:16:19

+1

您是否通過對話框配置了斷點設置? – 2015-03-24 16:18:57

+0

是的,我想我在上面的問題中概述了這一點。 – 2015-03-24 16:30:32