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

本文介绍了Java调试的关键技巧,包括条件断点、单步过滤器和跳出函数到选定层。详细阐述了如何在Eclipse等IDE中设置和使用这些工具,并探讨了在生产环境中提高日志等级、检查堆栈跟踪等最佳实践。
摘要由CSDN通过智能技术生成

c45f3c6db27bf43c8559d85241a690e2.png

原文:medium.com/@AriNoman/java-debugging-731c21d278be

编译:覃佑桦

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

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

0 调试 Java 项目

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

条件断点

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

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

0d98617c19d61dbb54fc233fb9c0e061.png

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

其他断点类型

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

  • 事件断点[4]:与事件绑定,在遇到调试器能够识别的事件时触发;

  • 字段断点[5]:给定字段或表达式的值发生变化时,字段断点将停止正在执行的程序。调试时可以指定一个字段作为观察点,表达式读取、修改时停止执行;

  • 方法断点[6] :进入或退出指定方法时挂起程序,用来检查特定方法的进入或退出事件;

  • 行断点[7]:程序到达断点中设置的特定代码行时停止程序执行。

使用 Rookout 设置断点

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

Rookout 有5种断点状态:

  • Active (紫色, 实心)

  • Pending (紫色, 空心)

  • Warning (紫色, 实心, 带三角形)

  • Error (紫色, 空心, 带三角形)

  • Disabled (灰色, 空心)

e7b4bbd426d64cc0c32a682e99f43ff9.png

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

Step Filter (单步过滤器)

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

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

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

1 远程调试

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

6022584ed53dc4557418ab655af50ad0.png

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

e5891a00932a8fc42112076532cefbf6.png

2 在生产环境调试 Java

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

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

  • 确定错误发生的时间;

  • 评估错误的严重程度(优先级);

  • 筛选定位导致程序出错的状态;

  • 接下来,跟踪并解决根本原因(root cause);

  • 最后,打补丁。

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

提高日志等级

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

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

6713211586e9aeeda74031c4abd8dbb4.png

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

集中日志

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

检查堆栈跟踪和其他日志

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

9886a8676b6661a559139b47d2ba09f7.png

输出结果:

acf0edd312a0ead352f37eb648727634.png

复制实例

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

3 总结

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

资源链接

[1]: 断点(Breakpoint), https://en.wikipedia.org/wiki/Breakpoint

[2]: Eclipse, https://www.eclipse.org/ide/

[3]: 几何平均数(Geometric mean), https://en.wikipedia.org/wiki/Geometric_mean

[4]: 使用断点进行高效调试, https://advancedweb.hu/effective-debugging-with-breakpoints/

[5]: 监视点(Watchpoint), https://www.jetbrains.com/help/clion/using-watchpoints.html

[6]: Eclipse设置方法断点(Setting Method Breakpoints), https://help.eclipse.org/2019-12/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-set_method_breakpoints.htm

[7]: Eclipse添加行断点(Adding Line Breakpoints), https://help.eclipse.org/2019-12/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-add_line_breakpoints.htm&cp%3D1_3_6_0_0

[8]: Rookout: 一款功能强大的调试工具(支持 Serverless 和容器化应用中的JVM、Node.JS和Python代码), https://www.rookout.com/

[9]: 断点状态(Breakpoint Status), https://docs.rookout.com/docs/breakpoints-status/

[10]: Eclipse调试中在 Step Into 时跳过指定类, http://www.eclipseonetips.com/2011/06/29/skip-over-certain-classes-when-using-step-into-in-eclipses-debugger/

[11]: 跳出函数到选定层(Drop to Frame), https://help.eclipse.org/2019-12/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fviews%2Fdebug%2Fref-droptoframe.htm

[12]: 远程调试必知项, https://www.rookout.com/blog/remote-debugging

[13]: 提升调试技巧必须牢记的5件事, https://medium.com/dev-bits/5-things-to-remember-for-better-debugging-of-your-code-94b9bc3fb3df

[14]: 如何通过日志节省调试时间, https://www.freecodecamp.org/news/how-to-save-hours-of-debugging-with-logs-6989cc533370/

[15]: 堆栈跟踪(Stack trace), https://en.wikipedia.org/wiki/Stack_trace

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值