2015-03-19 34 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