不同Java调试方法总结 - Vardhan


本文将讲一些我们作为Java程序员构建优秀系统应该知道的Java调试方法。
调试过程可以分为四个主要步骤:定位、分类、理解和最终修复错误。本地化意味着确定错误在代码中的位置。特定的服务或功能可能负责产生错误。
使用版本控制管理系统是另一种从提交中识别或缩小错误的好方法;git-bisect是实现这一目标的有用工具。之后,我们必须对错误进行分类,即它是句法、语义错误,它是否依赖于某些外部值,还是与构建错误有关?
 
不同的调试方法:
在调试方面,我们使用的工具和技术是必不可少的,它们可以决定修复代码中的问题的难易程度。我们来谈谈一些流行的方法。
1. 使用断点
断点是一种有意在程序中为调试目的而设置的特定行处停止或暂停的方式。调试器在该行上放一段代码,在执行过程中,它可以调用调试器或在 CPU 级别创建中断,将其传递给调试器的异常处理程序。
在 Java 中,我们可以使用条件断点或异常断点。条件断点最适合 Eclipse IDE,因为它们可用于通过指定条件删除程序中的错误,当它为真时线程将在目标行停止。异常断点可以在Eclipse和Netbeans中使用;它们也不与单个代码行相关联,因此适用于整个过程。
不同的调试器对其调试控制算法有不同的实现,可以向断点添加条件,这有助于在特定阶段有条件地停止或暂停代码。有些人可以选择在再次恢复执行之前操作一段数据。
 
2.打印调试
打印调试是每个开发人员在其开发生涯的某个阶段使用的最常用的技术,在应用程序运行期间将值转储到应用程序控制台或用户界面。这也可用于 Java 和其他编程语言。
我们开发人员这样做是为了了解函数或服务内部的流程,有时是为了了解获取或操作的数据的形状。根据我们假设错误所在的位置将打印语句添加到代码中——没有固定的约定。
虽然这不是一种非常可靠的调试方法,但在涉及愚蠢错误、开发人员无法理解应用程序流程或导致错误的代码块可识别的情况下,它非常方便。

3. 远程调试
这是一种广泛使用的技术,涉及当调试器和应用程序不在同一平台/服务器上运行时远程调试进程。远程调试有时与生产调试同时进行。
当我们为资源最少且无法同时包含运行应用程序和调试应用程序代码的小型设备开发软件时,远程调试是首选方法。此外,当我们尝试调试具有多个组件连接并相互通信以服务客户端请求(例如微服务)的大型应用程序时,它也很有用。
正如我们所知,调试器需要通过基本钩子连接到操作系统和应用程序,以便它可以触发调试过程。当我们在应用服务器中安装远程调试代码时,它本身不是调试器,它只是连接到运行服务器的应用程序。它还通过网络连接到远程调试器,并向远程调试器发送或接收命令。
有许多远程调试工具。一个例子是 Lightrun;他们提供Lightrun Cloud,这是一款免费使用的生产调试器,具有日志记录功能和暂存环境。它在用于 Java 应用程序的 IntelliJ IDE 上运行,非常适合 Monolith、微服务、Kubernetes、Docker Swarm、ECS、大数据工作者、无服务器以及更多此类应用程序。
另一个很好的例子是Eclipse。虽然 Eclipse 也是一个 IDE,但它具有许多用于调试的高级功能,这使其成为一个整体工具。它适用于 Java、Python、Ruby、C# 和 PHP。Eclipse 的一个常见用途是管理远程调试配置,它可以非常轻松地实现相同的功能,使其在 Java 开发社区中非常流行。
 
4. 内存转储调试
当程序崩溃时,系统会创建内存快照以及它在特定时间保存的数据。这称为内存转储。因此,这很有用,因为开发人员可以轻松找到进程崩溃的确切位置并进行内存转储,以查看在该点调用的函数的“堆栈跟踪”以及可访问的局部或全局变量的值。
但这里的关键事实是我们可以在没有崩溃的情况下获得内存转储,因为存在进程永远不会崩溃的不同类型的错误。我们谈论的是进程的内存转储,但我们也可以获得整个系统的内存转储,其中多个进程从不同的应用程序运行。
当您有多个 Java 应用程序相互通信时,这很有用,并且您无法准确确定谁对创建错误负责。但是,如果内核崩溃与进程或系统崩溃不同,则有时获取内存转储具有挑战性,因为它在获取转储之前释放了内存。
 
5. 回放调试
重放调试是另一种有用的技术。这个想法来自逆向工程,在那里我们有一个明确定义的实际过程流,从那里,我们可以追溯到问题。重放调试的第一步是记录执行过程中的所有事件调用、内存管理、硬盘中的数据更改、用户输入和其他连接的设备输出都添加到快照中。
这段录音是通过执行流程然后监控触发的不同事件而生成的。最后,当进程结束时(它可以成功完成或有系统中断或进程可能崩溃),它包含执行周期中的所有相关信息。
开发人员或质量保证工程师可以使用此记录来遍历流程的执行路径或连接到调试器并尝试确定出了什么问题。当我们尝试重新生成错误时,这可能会派上用场,因为它为我们提供了整个过程的整体视图。