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

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

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

0 调试 Java 项目

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

条件断点

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

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

044238a0dd7fce9e16546698bfbaf434.png

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

其他断点类型

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

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

使用 Rookout 设置断点

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

Rookout 有5种断点状态:

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

87118d7474f6668e8a6984b58edf5013.png

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

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 远程调试。设置调试参数如下:

4334e2ff77585f46bebfd7fdd4bdfdff.png

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

bf6735b72ddb889cd3ed37a47c780c2a.png

2 在生产环境调试 Java

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

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

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

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

提高日志等级

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

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

e2b1bb600922ecf8a3480ac3afff0b3c.png

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

集中日志

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

检查堆栈跟踪和其他日志

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

40fff67b351df4e493c00e5a59a79175.png

输出结果:

ec8f294b6fa939e000e8ac4d51069e99.png

复制实例

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

3 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python字符串转浮点数_Python | 打印不同的值(整数,浮点数,字符串,布尔值)...

python字符串转浮点数In the given example, we are printing different values like integer, float, string and Boolean using print() method in python. 在给定的示例中,我们使用python中的print()方法打印不同的值,例如整数,浮点数&…

(6) 如何用Apache POI操作Excel文件-----POI-3.10的一个和注解(comment)相关的另外一个bug...

如果POI-3.10往一个工作表(sheet)里面插入数据的话,需要注意了,其有一个不太被容易发现的bug。 被插入的工作表(sheet)里面的单元格没有包含任何的注解(comment)的时候,插…

mysql下拉刷新加载数据_下拉刷新、加载数据功能

paging nick加载更多getData();varm0,n2;//m:button点击次数 n:一次加载几条数据$(.page-btn-nick).click(getData);functiongetData(){$.ajax(paging.html).then(function(response){//测试url写本页面varobj{developer:[{name:nick},{name:ljy},{name:xzl},{name:jeson},{nam…

mcq 队列_人工智能逻辑才能问答(MCQ)

mcq 队列1) Why do we want to implement the concept of Logic in an AI system? So that the agent can have decision making capabilitySo that the agent can think and act humanlySo that the agent can apply the logic for finding the solution to any particular p…

第三周作业!

1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。答:本题思路:先用who命令列出当前登陆的用户信息,然后使用cut命令对字段进行分割,选出我们需要的字段…

python导入模块以及类_python模块的导入以及模块简介

标签: 一、模块的定义及类型 1、定义 模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块 …

mysql 指定数字排序_Mysql数据排序

排序数据普通字段排序按照单一字段排序按照多个字段排序手动指定排序顺序单个字段手动排序多个字段手动排序普通字段排序按照单一字段排序排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,or…

《黃帝內經 —— 央視60集紀錄片》

下載地址: http://pan.baidu.com/s/1dFI8hxf 目錄 第一部 医史篇第1集:神奇的秘笈(《黄帝内经》是部什么书)第2集:赫赫始祖(上)(黄帝、炎帝)第3集:赫赫始祖&a…

mnist手写数字数据集_mnist手写数据集(1. 加载与可视化)

》》欢迎 点赞,留言,收藏加关注《《1. 模型构建的步骤:在构建AI模型时,一般有以下主要步骤:准备数据、数据预处理、划分数据集、配置模型、训练模型、评估优化、模型应用,如下图所示:【注意】由…

python凯撒密码实现_密码:凯撒密码及其Python实现

python凯撒密码实现Before we start let’s some basic terminology... 在开始之前,让我们先介绍一些基本术语... The art and science to achieve security by encoding messages to make them unreadable are known as Cryptography. That’s what the whole art…

qtextedit 默认文案_QT-纯代码控件-QSplitter(分裂器)

版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_41488943/article/details/96431379使用Qplitter实现页面的三布局分布1.新建一个无ui界面的工程&…

TYVJ P1030 乳草的入侵 Label:跳马问题

背景 USACO OCT09 6TH描述 Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿&#xff0c;他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地。草地像往常一样&#xff0c;被分割成一个高度為Y(1 < y < 100)…

kotlin中既继承又实现_Kotlin程序| 解决继承中的主要冲突的示例

kotlin中既继承又实现继承中的主要冲突 (Overriding Conflicts in Inheritance) It may appear, we inherit more than one implementation of the same method. 看来&#xff0c;我们继承了同一方法的多个实现。 Need to implement all the methods which we have inherited f…

python雷达图详解_Python简单雷达图绘制

import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.family] SimHei matplotlib.rcParams[font.sans-serif] [SimHei] lables np.array([综合,KDA,发育,推进,生存,输出]) nAttr 6 date np.array([7, 5, 6, 9, 8, 7]) angles…

浏览器兼容问题 透明度 position:fixed bootstrap

浏览器兼容问题&#xff1a;主要是ie8以下&#xff1a; 用bootstrap框架结合jq写页面&#xff0c;因为bootstrap有好多media和html5所以要在引入样式后引入两个js <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --><!-- WARNI…

s查找mysql服务_MySQL菜鸟实录(一):MySQL服务安装实战

CentOS 7基本信息系统版本&#xff1a; CentOS 7.3 64bit系统配置&#xff1a; 4vCPUs | 8GB磁盘空间&#xff1a;[rootecs-ce5a-0001 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 40G 17G 22G 44% /devtmpfs 3.9G 0 3.9G 0% /devtmpfs 3.9G 0 3.9G 0% /dev…

实验一 线性表的顺序存储与实现_【自考】数据结构中的线性表,期末不挂科指南,第2篇

线性表这篇博客写的是线性表相关的内容&#xff0c;包括如下部分&#xff0c;先看下有木有期待啥是线性表线性表的顺序存储线性表的基本运算在顺序表上的实现线性表的链式存储线性表的基本运算在单链表上的实现循环链表与双向循环链表Over&#xff0c;内容还蛮多的&#xff01;…

二叉树打印叶子节点,非递归_使用递归打印链接列表中的备用节点

二叉树打印叶子节点,非递归Solution: 解&#xff1a; Input: A singly linked list whose address of the first node is stored in a pointer, say head 输入&#xff1a;一个单链表 &#xff0c;其第一个节点的地址存储在指针中&#xff0c;例如head Output: The alternati…

TYVJ P1012 火柴棒等式 Label:枚举

背景 NOIP2008年提高组第二题描述 给你n根火柴棍&#xff0c;你可以拼出多少个形如“ABC”的等式&#xff1f;等式中的A、B、C是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是0&#xff09;。用火柴棍拼数字0-9的拼法如图所示&#xff1a;注意&#xff…

java math max_Java Math类静态double max(double d1,double d2)示例

java math max数学类静态double max(double d1&#xff0c;double d2) (Math Class static double max(double d1,double d2) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the maximum one of both the give…