如何在Android Studio中正确设置异常断点?

6
我已经尝试了数月,但无法让我的调试器断点停在我的代码上。每个未捕获的异常都会在ZygoteInit.run()方法中断开。
以下是我采取的措施列表:
1. 在应用程序模块的build.gradle文件中添加debug { debuggable true }。 2. 在AndroidManifest.xml文件中手动添加debuggable =“true”。 3. 在断点窗口中选中Any exception复选框。 4. 将相关类过滤器模式添加到Any exception断点中
这会导致调试器完全跳过所有未捕获的异常。
我一直通过查看Logcat中的堆栈跟踪来进行调试,其中显示了我的类在堆栈跟踪中。
我已在稳定版和金丝雀渠道的当前和以前版本中看到此版本。
这里有我错过的东西吗?
编辑:为了澄清,问题在于 我未选中 "Caught exception" 复选框。 选择此框后解决了我的问题。
如果有帮助,以下是我的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 窗口的截图。 Breakpoints window

你不能在每个地方都添加try/catch块来缩小异常发生的范围,然后在缩小到特定代码块后设置断点并调试代码吗? - Daniel Nugent
@DanielNugent 我的代码库非常庞大。那不是一个现实的解决方案。我希望调试工具能够像广告中宣传的那样正常工作。 - Jeremy White
1
你是在点击调试按钮而不是运行按钮,对吧?并且你正在使用可调试的构建变体,是吗? - nasch
@nasch 我已经添加了我的gradle文件的相关部分。 - Jeremy White
默认的Gradle设置包括一个debug构建类型,其中debuggable被设置为true。 - Jeremy White
显示剩余3条评论
2个回答

10

请确保以下几点:

  • 将挂起设置为所有
  • 通知开启:
    • 如果定义了错误处理,则捕获异常Caught exception
    • 如果未处理异常,则捕获异常Uncaught exceptions
  • 将类过滤器设置为仅包括您的代码、Android 代码和Java 代码

在此处查看更详细的说明:https://dev59.com/tWAf5IYBdhLWcg3wXhyz#28862538

Breakpoints dialog

这种方法捕获引发的所有异常(当勾选“caught”和“uncaught”时)。因此,所有内部异常都会被触发。通过排除其中一些异常,可以通过指定类过滤器来限制异常。例如,在上面的屏幕截图中,经常在启动期间引发的ClassNotFoundException被忽略。

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


这个没办法在不触发已捕获的异常的情况下完成吗? - Jeremy White
是的,在上面的对话框中,取消选中“通知”下的“捕获异常”。 - CJBS
1
我认为这可能是导致我无法调试自己代码的原因。因为在Android中,所有异常都被捕获在ZygoteInit.run()函数中。 - Jeremy White
你能否开始调试,在你的初始化代码中设置断点,并在该代码处中断(即在任何异常发生之前)?这是在你自己的代码中还是在一个包含的库中,其中异常没有被正确捕获? - CJBS
是的,我能够在方法断点处捕获。但我无法在自己的代码或库中断点。 - Jeremy White
显示剩余4条评论

1

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

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

  1. 点击“附加调试器到Android进程”
  2. 在“选择进程”窗口中,选择您要附加调试器的设备和应用程序
  3. 点击“调试”打开调试工具窗口

    要查看和配置断点设置,请单击调试工具窗口左侧的“查看断点”。断点窗口将出现,您可以在其中进行配置。

异常有三种主要类型:

  1. 已检查异常:必须由代码处理。 这些表示可避免的异常情况,可以 被处理和恢复。

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

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


我已经附加到该进程,因为我已经单击了调试图标,并且可以在运行应用程序时停止方法断点。 - Jeremy White
是的,我做了,我想我在上面的问题中概述了。 - Jeremy White
所有的复选框都被勾选,例如捕获异常和未捕获异常? - user3667171
不,明确一下,CJBS 的答案解决了我的问题。我是在他的回答中要求更多解释。 - Jeremy White
无论谁做得更快,CJBS的帖子最终帮助我解决了问题。在他回答之前,你的回答没有提到在捕获异常时中断的任何参考。 - Jeremy White
1
描述如何检查基础知识的说明和解释对某些人会很有用。+1 - CJBS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接