【问题标题】:How do I properly set an exception breakpoint in Android Studio?如何在 Android Studio 中正确设置异常断点?
【发布时间】:2015-05-22 04:36:06
【问题描述】:

几个月来,我一直在尝试让我的调试器中断我自己的代码,但没有成功。每个未捕获的异常都会在 ZygoteInit.run() 方法中中断。

这是我采取的行动的列表。

  1. 在我的应用模块的 build.gradle 文件中添加了 debug { debuggable true }
  2. 手动将debuggable="true" 添加到我的AndroidManifest.xml 文件中
  3. 选中“断点”窗口中的 Any exception 复选框
  4. Any exception断点添加了相关的类过滤器模式
    • 这会导致调试器完全跳过所有未捕获的异常

我一直在通过查看 Logcat 中的堆栈跟踪进行调试,它确实在堆栈跟踪中显示了我的类。

我在稳定和金丝雀频道的当前和以前的版本中看到了这个版本。

这里有什么我遗漏的吗?

编辑:只是为了澄清一下,问题是我没有选中“捕获异常”框。选中此框解决了我的问题。

这是我的 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"
    }
}

这是我的断点窗口的屏幕截图。

【问题讨论】:

  • 你不能在任何地方都添加 try/catch 块来缩小异常发生的范围,然后在你将代码缩小到特定块后放置一个断点并调试代码代码?
  • @Fahim 没有解决我的问题。该链接没有详细提及异常断点。
  • @DanielNugent 我的代码库非常大。这不是一个现实的解决方案。我希望调试工具能像宣传的那样工作。
  • 要问愚蠢但必要的问题,您单击的是调试按钮而不是运行按钮,对吗?而且您正在使用可调试的构建变体?
  • 哈哈,是的,我正在做这两件事。不过,感谢您的检查!有时这是愚蠢的事情......

标签: java android android-studio


【解决方案1】:

还有几件事要确保:

  • 暂停设置为全部
  • 关于以下内容的通知:
    • 捕获异常如果要捕获定义了错误处理的异常
    • 未捕获的异常如果要捕获未处理的异常
  • 将类过滤器设置为仅包含您的代码、Android 代码和 Java 代码

在此处查看更详细的说明:https://stackoverflow.com/a/28862538/3063884

这种方法会捕获所有引发的异常(当检查 'caught' 和 'uncaught' 时)。因此引发了所有内部异常。类过滤器的规范通过排除其中一些例外来限制这一点。例如,在上面的屏幕转储中,在启动期间经常引发的ClassNotFoundException 将被忽略。

这种方法的一个小缺点是,在应用程序启动期间,可能会出现一条消息,指示“无法找到当前堆栈帧的源类”。这是因为尚未加载所有源代码。这只会在启动期间发生一次,可以安全地忽略。避免这种情况的另一种方法(如果在应用程序启动期间没有预期的异常)是“运行” 应用程序(而不是启动“调试”),然后通过 运行 -> 将调试器附加到 Android 进程 ... 或按工具栏中的 按钮。

【讨论】:

  • 如果不打破捕获的异常,就没有办法做到这一点吗?
  • 是的 - 在上面的对话框中,取消选中通知下的“捕获异常”。
  • 我认为这可能是导致我无法破解自己代码的原因。由于 Android 中的所有异常都在 ZygoteInit.run() 中捕获
  • 您是否能够从调试开始,在初始化代码中的某处放置断点,并让它在该代码上中断(即在任何异常发生之前)?这是在您自己的代码中还是在未正确捕获异常的包含库中?
  • 是的,我能够在方法断点处捕获。我无法破坏自己的代码或库。
【解决方案2】:

您需要将调试器附加到正在运行的进程中

您不必总是重新启动应用来调试它。
要调试您已经在运行的应用程序:

  1. 单击将调试器附加到 Android 进程
  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. 已检查的异常:必须由代码处理。 这些代表可以避免的异常情况 处理和恢复。

  2. 运行时异常:不需要由 代码。这些代表意外的异常情况 可以处理,但不一定能从中恢复。

  3. 错误:不需要由代码处理。这些 代表严重的意外异常情况 不要试图处理。

【讨论】:

  • 我已附加到该进程,因为我单击了调试图标,并且可以在运行应用程序时在方法断点处停止。
  • 是的,我想我在上面的问题中概述了这一点。
  • 是否包含所有复选框,例如已捕获的异常和未捕获的异常滴答声?
  • 没有。需要明确的是,CJBS 的答案解决了我的问题。我在他的回答中要求更多解释。
  • 描述如何检查基础知识的描述以及解释对某些人来说是有用的。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2018-01-30
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多