在 Android Studio 中使用调试器利用收藏夹保持井井有条根据您的偏好保存内容并进行分类。

5. 使用调试器

Debug(调试)窗格

您可能已经注意到 Debug(调试)窗格顶部有许多按钮,但这些按钮目前意义不大,而且大部分呈灰色且不可点击。本节将介绍调试器中更常用的功能。当其他按钮变得有用时,本教程会进行相应说明。

首次启动调试器时,您会在 Debug(调试)窗格中看到许多按钮。在 Debug(调试)窗格顶部,可以看到 Debugger(调试器)和 Console(控制台)按钮。

Console(控制台)按钮显示应用的 logcat 输出。如果您在代码中有任何日志语句,输出内容将在执行该段代码时显示出来。

Debugger(调试器)按钮会显示三个独立的窗格,它们目前是空的,因为您还没有使用调试器:

帧 (Frames) 显示

评估和监视表达式输入

变量 (Variables) 窗格

使用常用的调试器功能

设置断点

调试器的主要功能之一是让您可以通过断点在特定代码行停止执行。

要在 Android Studio 中设置断点,您需要导航到特定的代码行,然后点击行号旁边的页边空白处。要取消断点,请点击页边空白处现有的断点,使其消失。

您可以亲自尝试一下,在设置 imageResource 变量的那一行设置断点。

使用 Resume Program(恢复程序)按钮

在上一节中,您在设置 imageResource 变量的那一行设置了断点。此断点会导致程序在该指令处挂起。当代码执行被调试器挂起时,您通常需要继续执行以让应用运行。最直接的方法是使用 Resume Program(恢复程序)按钮。

要恢复程序,请执行以下步骤:

点击 Debug ‘app’(调试“应用”)。应用启动后,您应该会看到类似下图的界面。

在恢复程序之前,有必要解释一下当调试器挂起执行时,您在屏幕上看到的内容:

Debug(调试)窗格中的许多按钮现在可以点击了。

Frames(帧)窗格显示了大量信息,其中包括对设置断点所在行的突出显示引用。

Variables(变量)窗格显示了许多项,但由于此应用变量不多,目前在该教程范围内没有太多相关信息。不过,检查变量的能力是调试器的一项基本功能,因为它能深入了解运行时代码中发生的情况。本教程稍后会详细介绍如何检查变量。

如果您查看设备或模拟器上的应用,会发现屏幕是空白的,因为应用挂起在了某一行代码上。更具体地说,执行在断点处停止,且 UI 尚未呈现。

请记住,应用并不会仅仅因为设置了断点就总是立即停止。这取决于您在代码中的什么位置设置断点。在本例中,您将其放在了应用启动时执行的一行代码上。

需要记住的关键点是,只有当尝试执行设置了断点的行时,应用才会挂起。虽然有很多方法可以推进调试器,但目前您只需使用 Resume Program(恢复程序)按钮即可。

点击 Resume Program(恢复程序)。

您现在应该能看到类似下图的画面。

大部分信息消失了,按钮再次变得不可点击。应用在设备或模拟器上也显示正常。原因在于代码不再挂起在断点处,应用处于正常的运行状态。调试器虽已附加,但在尝试执行设置了断点的代码行之前,它不会做太多操作。请保留此断点,因为它在接下来的示例中很有用。

使用 Step Into(单步跳入)按钮

调试器的 Step Into(单步跳入)按钮是运行时深入研究代码的便捷方式。如果某条指令调用了方法或其他代码段,Step Into 按钮可让您进入该代码,而无需在启动调试器设置断点之前手动导航到那里。

要使用 Step Into 按钮,请执行以下步骤:

在 MainActivity 类的 onCreate() 函数中,在调用 DiceRollerApp() 函数的 setContent lambda 主体中创建一个断点。

点击 Debug ‘app’(调试“应用”)以重新运行应用。执行会在调用 DiceRollerApp() 函数的那一行挂起。

点击 Step Into(单步跳入)。

现在第 40 行被突出显示,Debug(调试)窗格中的 Frames(帧)窗格显示代码挂起在第 40 行。

如果展开 Frames(帧)窗格,可以看到突出显示行之后的那一行以 invoke: 开头,后面跟着一个行号(上图中为 32)。这就是所谓的调用栈。本质上,它显示了导致代码执行到当前行的调用链。在本例中,第 32 行包含一条调用 DiceRollerApp() 函数的指令。

当您在调试器停止在该函数调用断点处时点击 Step Into(单步跳入)按钮,调试器就会单步跳入该函数,将执行路径引导至声明该函数的第 40 行。突出显示的行指示了执行挂起的位置。如果突出显示行之后的行关联有行号,则表示执行路径。在本例中,调试器表明第 32 行的指令将您带到了第 40 行。

点击 Resume Program(恢复程序)。

这应该会带您回到最初设置的断点。您可能对第一个示例中停止执行时所看到的内容有了更多的了解。这是 Resume program(恢复程序)部分第六步中的同一张图片。

在调用栈中,您可以看到 DiceWithButtonAndImage() 函数挂起在第 50 行,该函数是从 DiceRollerApp() 函数的第 41 行调用的,而后者又是在第 32 行调用的。调用栈功能可以帮助您了解执行路径。当一个函数在应用中的许多不同地方被调用时,这非常有帮助。

Step Into(单步跳入)按钮提供了一种进入函数并挂起执行的方法,而无需在函数本身内设置断点。在本例中,您在对 DiceRollerApp() 函数的调用上设置了断点。当您点击 Step Into(单步跳入)按钮时,执行会在 DiceRollerApp() 函数内部挂起。

Dice Roller 是一个相当小的应用,因为没有太多的文件、类或函数。当您使用更大的应用时,调试器的 Step Into(单步跳入)功能会变得更有用,因为它让您可以深入研究代码,而无需自己手动导航。

使用 Step Over(单步跳过)按钮

Step Over(单步跳过)按钮提供了另一种在运行时逐步执行应用代码的方法。它将执行移动到下一行代码并推进调试器。

要使用 Step Over(单步跳过)按钮,请执行以下步骤:

点击 Step Over(单步跳过)。

现在您可以看到调试器在下一行执行代码(即第 51 行)处挂起了程序。您可以继续连续地逐行执行代码。

使用 Step Out(单步跳出)按钮

Step Out(单步跳出)按钮与 Step Into(单步跳入)按钮的作用相反。Step Out(单步跳出)按钮不是向下深入调用栈,而是向上导航调用栈。

要使用 Step Out(单步跳出)按钮,请执行以下步骤:

点击 Step Out(单步跳出)。

您能猜到程序会在哪一行挂起吗?

请注意,调试器从 DiceRollerApp() 函数中跳出,回到了调用它的那一行代码。

当您发现自己处于方法调用栈太深的位置时,Step Out(单步跳出)按钮是一个有用的工具。它让您可以向上导航调用栈,而无需遍历进入的每个方法的所有代码。

检查变量

本教程早些时候简要介绍了 Variables(变量)窗格,下面将提供更深入的说明,讲解如何检查窗格中显示的变量,从而帮助您调试应用中的问题。

要检查变量,请执行以下步骤:

点击断点以将其从调用 DiceRollerApp() 函数的位置移除,但保留设置 imageResource 变量处的断点。

点击 Debug ‘app’(调试“应用”)。您应该会看到 result$delegate 变量是一个值为 1 的 MutableState。这是因为在定义变量时,它是用 mutableStateOf 1 进行实例化的。MutableState 意味着 result 变量持有一种可以改变的状态。

注意:Variables(变量)窗格中的 result$delegate 变量引用的是代码中的 result 变量。$delegate 符号存在是因为 result 变量是一个 remember 代理。

点击 Resume Program(恢复程序)。

在应用中,点击 Roll(掷骰子)。您的代码再次在断点处挂起,您可能会看到 result$delegate 变量出现了不同的值。

在此图中,result$delegate 变量的 mutable 状态持有值为 2。这演示了如何使用调试器在运行时检查变量。在功能更全的应用中,变量的值可能会导致崩溃。当您使用调试器检查变量时,可以更深入地了解崩溃细节,从而修复错误。

Copyright © 2088 国足世界杯出线形势_世界杯出线 - ybjysq.com All Rights Reserved.
友情链接