3. 使用断点进行调试
在学习日志记录时,您学习了有策略地放置日志,以帮助发现 bug 并验证 bug 是否已修复。不过,如果遇到并非由您引入的 bug,有时候就无法确定应该在何处放入日志语句或输出哪些变量。通常,您只能在运行时找到这些信息。
fun division() {
val numerator = 60
var denominator = 4
repeat(5) {
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
这时候断点就派上用场了!即使您根据堆栈轨迹中的信息大致知道是什么导致了 bug,也可以添加断点,以此作为特定代码行的停止符号。到达某个断点后,代码会暂停执行,使您能够在运行时使用其他调试工具,以便仔细查看发生的情况和问题所在。
连接调试程序
在后台,Android Studio 会使用一个名为 Android 调试桥(简称 ADB)的工具。这是一个集成到 Android Studio 中的命令行工具,可以为正在运行的应用提供调试功能,如断点。用于调试的工具通常称为“调试程序”。
为了将调试程序用于(连接到)应用,您不能像以前那样简单地通过依次点击 Run > Run 来运行应用,而应通过依次点击 Run > Debug ‘app' 来运行应用。
向项目中添加断点
执行以下步骤来看看断点的实际运用:
点击您希望在其位置暂停的行号旁边的空白处来添加一个断点。该行号旁边会出现一个点,并且该行会突出显示。
依次点击 Run > Debug ‘app' 或使用工具栏中的 图标,在连接了调试程序的情况下运行应用。应用启动时,您应该会看到如下所示的屏幕:
应用启动后,您会看到断点被激活时突出显示。
在您之前查看 Logcat 窗口的屏幕底部,系统打开了一个新的 Debug 标签页。
左侧是函数列表,它们与堆栈轨迹中显示的列表相同。右侧是一个窗格,您可以在其中查看当前函数(即 division())中各个变量的值。顶部还提供了按钮,可以帮助您在已暂停的程序中导航。您将最常用的一个按钮是 Step Over,点按后会执行突出显示的一行代码。
执行以下步骤来调试代码:
到达断点后,第 19 行(声明 numerator 变量)现已突出显示,但尚未运行。使用 Step Over 按钮执行第 19 行。现在,第 20 行将突出显示。
在第 22 行设置一个断点。这是出现除法的位置,也是堆栈轨迹报告异常的那一行。
使用 Debug 窗口左侧的 Resume Program 按钮转到下一个断点,并运行 division() 函数的其余部分。
请注意,在第 17 行停止了执行,未执行该行。
每个变量(numerator 和 denominator)的值都显示在其声明旁边。您可以在“Debug”窗口的 Variables 标签页中看到这些变量的值。
再按“Debug”窗口左侧的 Resume Program 按钮 4 次。每次循环暂停并观察 numerator 和 denominator 的值。在最后一次迭代时,numerator 应该为 60,denominator 应该为 0。但不能将 60 除以 0!
现在,您已经知道了导致 bug 的确切代码行,并且知道了确切的原因。和之前一样,您可以通过将重复代码的次数从 5 更改为 4 来修复 bug。
fun division() {
val numerator = 60
var denominator = 4
repeat(4) {
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
提示:如需移除某个断点,请点击显示在行号旁边的点。