深入Java调试技术 -Ari Noman


软件错误是开发过程中不可避免的一部分。因此,调试是每个程序员都应具备的一项核心技能。因此,Java调试是每个程序员都应具备的一项核心技能。
它不仅可以帮助您了解程序流程,还可以提高代码质量。最后,它提高了您作为开发人员解决问题的能力,并最终提供了质量更高的软件。
本文深入探讨了Java调试的一些最重要的技巧和技术。在生产环境中调试Java时,我们还将介绍最佳实践。
本节汇总了调试Java项目时要使用的一些技巧和窍门,包括断点,步骤过滤器,拖放到框架等。即使在最复杂的情​​况下也可以应用这些。

条件断点
一个断点用于指定的地步调试时,程序的执行应停止。通过暂时挂起执行,您可以调查程序的字段和变量,更改其值等等。条件断点设置为在满足特定条件时触发,以便您可以检查程序的状态。一般通过IDE设置实现。

更多类型的断点
除了上面介绍的断点类型外,还有其他类型的断点,但是这取决于您使用的Java IDE。它们包括:

  • 基于事件的断点 -这些断点与事件相关,通常在遇到调试器识别的事件时触发。
  • 字段观察点 -每当给定字段或表达式的值更改时,这种类型的断点将停止执行程序。调试时,可以指定字段观察点以在读取,修改或同时读取和/或表达式时停止执行。
  • 方法断点 -用于在到达或退出指定方法或其实现时暂停程序。这使您可以检查特定方法的进入或退出条件。
  • 行断点 -当程序到达断点中设置的特定代码行时,暂停程序的执行。

使用Rookout使使用断点更容易
Rookout是下一代调试平台,旨在帮助开发人员在程序代码中添加不间断的断点,以便他们可以收集所需的任何类型的数据。它允许您指定规则以完善何时或如何触发断点的条件。
借助断点上的断点进行调试的一件很酷的事情是它的断点状态功能-一个简单的可视指示器,可提供有关断点行为方式的快速反馈。断点状态显示为断点旁边(在右侧窗格中)的警告标志或灯泡。
转换中的断点状态有五种类型,分别是:

  • 活跃(纯紫色)
  • 待处理(紫色
  • 警告(带三角形的纯紫色)
  • 错误(紫色,带有三角形)
  • 失效(灰色)

断点状态功能使您甚至可以在收到日志行或调试消息之前就对程序有所了解。此信息使您的调试更加容易。

步骤滤波器
通过步骤筛选,您可以定义在调试期间可以跳过的程序包。当您需要从一个类转换到另一个类,访问外部库或使用框架而不测试框架的类时,这一点尤其重要。
通过使用步骤筛选器功能限制转换,可以跳过特定的程序包。在Eclipse中,可以通过“ 窗口首选项”>“ Java调试”>“步骤过滤”来配置步骤过滤器。


Drop to frame
此技术使您可以在调试过程中选择并重新运行程序的一部分。您可以选择调用堆栈中的任何帧,并将调试器设置为从该点重新启动。
要使用此功能,请在堆栈中选择一个框架或一个关卡,然后在“调试”视图中单击“ Drop-to-frame ”按钮。
尽管此功能执行某种后退或重置,但它不会影响您的字段或现有数据。例如,如果您将一些条目写入数据库,然后下降到上一个级别或框架,则这些条目仍将保留在数据库中。

远程调试
大多数Java IDE(例如Eclipse)允许开发人员调试在另一台设备或Java虚拟机(JVM)上运行的应用程序。但是,您将需要使用某些标志来启动Java程序。
下面的代码片段演示了如何完成此操作:

Java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp: transport=dt_socket, server=y, suspend=y, address=5005

Eclipse用户可以输入主机名和端口号进行连接以进行远程调试.

在生产中调试Java
当今的软件开发环境节奏如此之快,因此研发团队一直在努力通过将代码更快地投入生产来满足这些需求。但是,无论您的测试过程有多么严格,有时都会出错。
此外,当代码投入生产且实际数据正在系统中流动时,事情可能会很快消失。为了在系统扩展时保持领先地位,解决应用程序中的潜在漏洞很重要。
每个Java开发人员都可以实施以下策略:

  • 识别何时发生错误
  • 评估错误对优先级的严重程度
  • 找出导致程序运行错误的状态
  • 接下来,跟踪并解决根本原因
  • 最后,部署有效的修补程序

除了使用上述五步策略之外,还应遵循一些最佳生产调试实践

提升日志记录级别
如果错误日志包含足够详细的消息,则调试应用程序会更容易。在大多数情况下,错误消息没有提供足够的上下文,因此程序员应增加日志级别。
这使您能够捕获整个上下文并了解导致错误的确切原因。每条日志行都应帮助您跟踪错误的根本原因。
一种实际的但经常未充分利用的跟踪错误来源的方法是在每个线程的应用程序入口点生成UUID。

集中日志
一个有效的记录机制处理的生产或应用程序生命周期的任何其他阶段期间的错误时应该优先。
在会话期间记录所有重要事件并将日志存储在集中式服务器中进行分析可以使调试更加容易。
它还可帮助您在跟踪关键产品指标时,关注应用程序出现问题的情况。

检查堆栈跟踪和其他日志
调试异常时,堆栈跟踪会派上用场。它们可帮助您确定程序崩溃时已调用了哪些函数。
使用堆栈跟踪,可以更容易地找出问题出在哪里,因为您可以查看导致异常的调用的顺序。

复制实例
保留日志后,重要的是要复制情况/实例。这可以通过创建类似的环境来完成,以便您可以在IDE中看到问题。
重现情况有助于解决错误,因为您可以更好地理解代码和环境。

总结
Java调试过程不必是一场噩梦。您只需要具有创新的心态并使用正确的工具即可。退出功能就是这样一种工具,可以帮助开发人员加快调试过程。它旨在帮助您以更高的置信度,速度和准确性来识别,诊断和解决代码中的错误。