在本系列中,我将引导您完成调试应用程序并在其中发现问题的过程。在我们调试时,我们将介绍对大多数开发人员来说很重要的技术。我将介绍以下调试器:

  • IntelliJ/IDEA – 使用 Java/Kotlin

  • PyCharm – Python

  • VSCode – 用于 JavaScript

  • WebStorm – 用于 JavaScript

这些应该涵盖您将遇到的大多数用例,并且有些东西看起来是重复的/冗余的,因此如果您觉得您“掌握了要点”,您可以直接跳到适用的部分。

请注意,虽然我不会介绍 TypeScript,但 JavaScript 教程中讨论的所有内容也适用于 TypeScript。这同样适用于大多数 JVM 语言,如 Scala 等。

通常人们会根据 IDE/Language 将这些教程分开。我认为将它们全部放在一起有助于提供“大图景”。在我们的职业生涯中,我们还会使用语言/IDE,拥有更广阔的视野是有帮助的。

在以后的文章中,我还想讨论使用 Chrome DevTools 和 Firefox Web Developer Tools 进行浏览器调试。然而,这些是一个稍微不同的过程,所以我现在将它们排除在外。

我还包括一个视频教程,以视觉方式突出显示这些步骤。如果我的指示不清楚,这可能会有所帮助:

动机

本系列的主要目标是让您快速上手,以便我们可以在接近尾声时深入研究真正有趣的教程。第一部分可能看起来有点微不足道,因为我假设对调试技术的了解为零,但我计划在我们前进的过程中深入了解这些帖子。

但你可能会问自己,为什么还要经历这个?

为什么我们需要通过调试教程?我已经知道编程和使用调试器并不完全是火箭科学......

嗯......根据这个研究,我们花了 50% 的时间来追踪错误,尽管我看到的数字从 25% 到 75% 不等。不幸的是,这是大学并没有真正教授的技能。即使在我们的工作中,人们也会掩饰这一基本技能。有一些书籍涵盖了这个主题,但很多已经过时并且针对更复杂的场景。

调试不仅仅是寻找错误。当我需要在我不熟悉的代码区域中实现新功能时,我经常调出调试器并开始调试这些区域。试图查看流程,就好像我在调试问题一样。检查堆栈、成员等,以更好地了解系统的工作方式并验证我的假设。

入门

首先,我们需要一个简单的应用程序,我们可以在本教程的初始部分进行调试。为此,我们将使用计算素数的 Prime Main。这是一个简单的应用程序,您可以在 IDE 中获取并打开它。

请注意,这些应用程序特别未优化且冗长,为我们提供了更多放置断点和跳过的地方。

以下是各种语言的版本:

  • Java –gist.github.com/shai-almog/e400134f01decc96..

  • Kotlin –gist.github.com/shai-almog/c454d39464ca2893..

  • Python –gist.github.com/shai-almog/8c8bbbb4297f758f..

  • JavaScript –gist.github.com/shai-almog/167a34571b0fae6e..

下载适当的源文件并将其作为主源文件添加到 IDE 的新项目中。您可以运行该应用程序,但请记住,它会运行很长时间来搜索素数。

简单条件断点

首先我们需要调试应用程序。在 JetBrains 的 IDE 中,我们只需右键单击可执行文件并选择调试,如下所示:

屏幕截图 2021-10-19 at 15.16.43.png

请注意,您可能需要等待 IDE 完成对文件的扫描和索引,以便显示适当的调试操作。

VSCode 也是如此。选择 IDE 左侧的调试视图,然后单击“运行和调试”按钮。

屏幕截图 2021-10-19 at 16.27.39.png

系统将提示您使用环境,选择 Node.js 继续。

一旦开始调试,您可以通过单击文件左侧的“gutter”区域设置断点。让我们对每种文件类型/IDE 做一个快速实验。

运行中

在 JetBrains IntelliJ/IDEA 上运行在 JetBrains IntelliJ/IDEA 上运行

在 VSCode 上运行在 VSCode 上运行

我们在文件中在线放置一个断点。请注意,Java 文件比其他 Prime Main 文件更复杂:

  • 对于 Java,将断点放在第 28 行

  • 用于 Kotlin 第 21 行

  • 用于 JavaScript 第 11 行

  • 用于 Python 第 11 行

一旦断点被命中,您应该能够在左下角看到堆栈跟踪。堆栈跟踪表示调用当前方法的方法。在堆栈的顶部,您会看到当前方法。您可以单击每个“堆栈帧”来查看调用者和调用者帧中变量的状态。

在右下角(对于 JetBrains)或左上角(对于 VSCode),您可以看到当前堆栈帧中的变量。注意 n 这是我们正在计算的数字。请注意,它不是一个原语,而是一个 BigInteger,我们用它来支持 Java 中非常大的数字(数字可能大于 9,223,372,036,854,775,807,这是 Long 的限制)。

我们可以使用“设置值”功能更改变量的值:

JetBrains 中的设置值JetBrains 中的设置值

VSCode 中的设置值VSCode 中的设置值

这对于调试边缘情况非常有帮助。只需将变量设置为您遇到问题的值并重现问题。

一个不错的 JetBrains 功能可让您以不同的方式查看值,例如作为十六进制,二进制等:

屏幕截图 2021-10-19 at 16.18.44.png

最后我们可以右键单击断点进行编辑。我们可以为断点设置一个条件,只有在满足条件时才会停止执行:

IntelliJ/IDEA 上 JetBrains 中的条件断点IntelliJ/IDEA 上 JetBrains 中的条件断点

条件断点通过 VSCode 中的编辑断点添加条件断点通过 VSCode 中的编辑断点添加

VSCode 中的条件断点编辑VSCode 中的条件断点编辑

由于 Java 代码有点不同,我使用了primesToTest[0] == 2,这始终是正确的。您可以尝试将其设置为 3,这将需要很长时间,您可以看到它只会在该点停止。

在其他情况下,我使用num % 2 == 0作为始终为假的条件。由于该行上方的行检查一个数字是否是偶数,它永远不会是。将此条件翻转到num % 2 == 1将始终为真,并且将命中断点。

更进一步

条件断点是调试器库中最强大但未充分利用的工具之一。当您在循环中遇到故障时,我们经常一次又一次地遍历循环......等待正确的条件实现。

通过使用设置值或条件,我们可以在调试过程中更快地移动,并可能更准确地重现问题,而不会出现您通常会看到的跨步延迟。

zoz100007 TL; 博士

在本系列的第一部分中,我试图强调调试技能对我们日常工作的重要性。优秀的开发人员有效且高效地使用他们的工具来提高生产力,而调试器是我们需要有效使用的复杂机器。根据一些统计数据,调试可能与我们的编码技能一样重要。不幸的是,即使是条件断点、设置值等基本功能也很少被大多数开发人员使用。我希望本系列中的这篇文章和未来的文章能帮助您改变这种状况并帮助您快速找到错误。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐