Bug(俗称"八阿哥") 是软件开发绕不过的一道坎,因此调试便成了每位程序员一项必备的核心技能。调试不仅有助于理解程序的运行流程,还能改进代码质量,最终提高开发者解决问题的能力以及交付软件的品质。

本文旨在讨论 Java 调试关键技巧,同时也会介绍生产环境中调试 Java 的最佳实践。

0 调试 Java 项目

本节讨论 Java 项目调试中的常见概念与技巧,包括Breakpoint (断点)、Step filter (单步过滤器)、Drop to Frame (跳出函数到选定层)等。这些技术同样可以在复杂场景下使用。

条件断点

断点用来指定在调试过程中程序停止执行的位置。通过临时挂起执行过程,可以观察或修改字段与变量值。下面的内容虽然使用了 Eclipse进行演示,但是相关概念同样适用于其他 Java IDE。条件断点即设置成在满足特定条件时触发的断点,用来检查条件发生时程序的状态、调用堆栈及重要的变量值。

下面的示例对音乐专辑得分计算算术平均值:

假设有数百张专辑,可以在循环中设置条件断点 album.getRating().score == 0。当出现专辑得分为0时,程序就会停止执行。

其他断点类型

除了上面介绍的断点类型,不同的 Java IDE 还提供了其他类型的断点:

  • 事件断点:与事件绑定,在遇到调试器能够识别的事件时触发;
  • 字段断点:给定字段或表达式的值发生变化时,字段断点将停止正在执行的程序。调试时可以指定一个字段作为观察点,表达式读取、修改时停止执行;
  • 方法断点 :进入或退出指定方法时挂起程序,用来检查特定方法的进入或退出事件;
  • 行断点:程序到达断点中设置的特定代码行时停止程序执行。

使用 Rookout 设置断点

Rookout 是一个创新的调试平台,在不停止或中断程序的情况下搜集调试数据。支持自定义断点触发条件。Rookout 提供的"断点状态"功能非常强大:在断点附近通过警告标志或 展示断点状态。

Rookout 有5种断点状态:

  • Active (紫色, 实心)
  • Pending (紫色, 空心)
  • Warning (紫色, 实心, 带三角形)
  • Error (紫色, 空心, 带三角形)
  • Disabled (灰色, 空心)

"断点状态" 可以在查看日志或调试信息前就能对程序运行状况有所了解。

Step Filter (单步过滤器)

Step Filter 可以在调试中指定需要跳过的 package。在调试多个 class、第三方库或框架时非常好用。在 Eclipse 中可以通过 Window Preferences >>Java Debug >>Step Filtering 配置。

Drop to frame (跳出函数到选定层)

这种技术可以在调试期间选择并重新执行程序的一部分:指定程序调用堆栈中任意帧(frame),在 Debug View 中点击 Drop-to-frame 按钮,调试器会从这里重新启动。Drop to frame 不会影响字段或现有数据,例如已写入数据库的记录。

1 远程调试

大多数 Java IDE 都支持 JVM 远程调试。设置调试参数如下:

Eclipse 用户需输入主机名 (hostname) 和端口号,如下图所示:

2 在生产环境调试 Java

现如今开发节奏越来越快,代码发布也是如此。无论测试流程如何严格,总会有漏网之鱼。当这些漏洞遇到生产中的实际数据,产生的压力随之飙升。因此,进行系统扩展的同时解决潜在的漏洞非常关键。

下面的策略可供每个 Java 开发者参考:

  • 确定错误发生的时间;
  • 评估错误的严重程度(优先级);
  • 筛选定位导致程序出错的状态;
  • 接下来,跟踪并解决根本原因(root cause);
  • 最后,打补丁。

除了上面的五个步骤,还应当遵守下面这些生产环境最佳实践:

提高日志等级

大多数情况下,错误信息没有包含足够的上下文内容,因此调试时需要提升日志等级。完整的上下文内容可以有效地理解、定位和确定错误的根本原因。一种常见的方法,在每个线程的入口点生成 UUID。

理想情况下,可以按照以下格式设置线程名称:

这样,堆栈跟踪信息会以 “threadName: pool-7-thread-22, UUID: EB85GTA, MsgType: AnalyzeGraph, MsgID: 415669, 29/03/2020 04:44” 开头,比起 “pool-7-thread-22” 这样的名字更有意义。

集中日志

在应用程序生命周期各阶段尤其是生产阶段处理错误时,应优先考虑高效的日志记录机制。把会话中所有重要事件汇集到统一的日志服务器,不但能够降低调试的难度,而且在跟踪关键产品指标时,还可以帮助监视应用程序中发生错误的情况。

检查堆栈跟踪和其他日志

调试异常时,堆栈跟踪非常有用:它能帮助确定在程序崩溃时调用了哪些函数以及调用顺序。下面的代码使用 printStack() 方法打印异常堆栈:

输出结果:

复制实例

获取日志后,接下来最重要的是在复制场景(实例)。通常会创建一个与 IDE 调试类似的环境,便于分析与解决错误。

3 总结

Java 调试并不是开发者的噩梦。一点创造性思维加上合适的工具,开发者会更有信心、更加快速准确地识别、诊断和解决代码中的错误。

qt5.9.0调试如何查看变量的值_深入了解 Java 调试相关推荐

  1. qt5.9.0调试如何查看变量的值_从0开发3D引擎(四):搭建测试环境

    大家好,本文介绍了3D引擎的测试方法,搭建了本地的测试环境. 上一篇博文 wonder-yyc:从0开发3D引擎(三):搭建开发环境​zhuanlan.zhihu.com 下一篇博文 wonder-y ...

  2. dev c++调试怎么看变量的值_利用GDB调试 MSQL

    原创 张政俊 老叶茶馆 来自专辑 MySQL修行 作者:张政俊 就职于中欧基金,知数堂粉丝,数据库爱好者,熟悉RDBMS.nosql.new sql等各类数据库. 啃完O'reilly的<高性能 ...

  3. java 成员变量默认值_在编写Java程序的时候,如果不为类的成员变量定义初始值,Java会给它们默认值,下列说法中不正确的一个是______。...

    茶艺是一种综合性的生活艺术,但对"茶艺"的______诠释究竟是什么,却众说纷纭,即使开茶艺馆的人,也多半______. 依次填入划横线部分最恰当的一项是______. 下图为某家 ...

  4. GDB调试利器-单步调试与查看变量

    前言 前面两篇已经对Linux下如何使用gdb启动调试,GDB调试利器-断点设置与查看源码我们已经了解了GDB基本的启动调试,设置断点,查看源码等,如果这些内容你还不知道,建议先回顾一下前面的内容. ...

  5. 【MATLAB appdesigner】27_如何在appdesigner中调试,查看变量?(举例+技巧)

    写作时间:2022-07-18 目录: 1. 如何在appdesigner中调试,查看变量 2.举例 3.总结 正文: 1. 如何在appdesigner中调试,查看变量 在实际的代码编写与调试过程中 ...

  6. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  7. 使用MDB查看变量的值(2)

    使用MDB查看变量的值(2) LW1A2@163.COM 本节描述使用MDB查看core文件中STL变量的知识 一.目的 在<使用MDB查看变量的值(1)>中,我们 探讨了查看变量值的一般 ...

  8. 使用MDB查看变量的值

    本节描述使用MDB查看core文件中变量的基本知识 基本概念: 一般程序发生coredump,80%的可能是由于参数的值不对造成的(其他可能是堆栈溢出.多线程等问题造成的).对于可以复现的问题,一般拿 ...

  9. vs2015自动窗口(查看变量的值)

    问题:在使用vs2015时,调试无法看到变量的值,解决方案如下: 1.启动调试 2.调试-->窗口-->自动窗口(Ctrl+Alt+V,A) 如下图:

最新文章

  1. C# ?(问号)的三个用处
  2. c语言 sizeof length,size()、length ()和sizeof()的区别
  3. 视图view没有主键,但可以添加唯一索引
  4. FMCW雷达书籍分享 FMCW radar design
  5. C语言 利用malloc()和realloc()动态分配内存
  6. Dsp BootLoader的学习
  7. datanode无法启动_Hadoop DataNode启动和初始化过程
  8. Java9个异常处理的最佳实践
  9. openstack架构详解图_英特尔顶级技术专家合力缔造精品:Linux开源网络全栈详解...
  10. 在Linux中切换用户的命令是set,Linux基础命令---切换用户su
  11. java sybase存储过程_sybase存储过程-----不定时更新
  12. 计算机图形学笔记(第二周)
  13. 给iOS库添加Cocoapods支持
  14. 机器视觉——目标跟踪
  15. Android瘦身优化
  16. 多款AGV模型3D图纸 零件图,装配图都有 潜伏式,搬运AGV,内部结构详细
  17. 用Opencv给韦小宝的身份证透视变换
  18. 集总参数电路抽象---线性电路叠加定理理解
  19. python中参数前面加星号是什么意思_详解Python函数中参数带星号是什么意思
  20. 2022-2028年全球及中国汽车保险丝行业投资前景分析

热门文章

  1. linux 系统调用时怎么知道当前上下文属于那个进程,linux – 编写系统调用来计算进程的上下文切换...
  2. ios 查看同文件名_实战恢复cisco 2950交换机的IOS
  3. php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单
  4. Google 修改 Chrome API,防止隐身模式检测
  5. Java分享笔记:自定义枚举类 使用enum关键字定义枚举类
  6. nginx1.10.2源码安装配置参数参考
  7. codevs3872 邮递员送信(SPFA)
  8. 0623TP框架联系
  9. java.util.concurrent.RejectedExecutionException
  10. 面向对象的相关面试题