故障排除之JAVA代码调试(下篇)

JAVA代码调试方法介绍(基于IntelliJ IDEA)

5. 断点状态

状态描述
Verified启动调试器会话后,调试器会检查在技术上是否可以在断点处暂停程序。如果是,调试器将该断点标记为已验证。
Warning如果在技术上可以在断点处暂停程序,但是有相关的问题,调试器会给你一个警告。例如,这可能发生在无法在某个方法的实现处暂停程序的情况下。
Invalid如果在技术上不可能在断点处暂停程序,调试器会将其标记为无效。最常见的原因是该行没有可执行的代码。
Inactive/dependent当一个断点被配置为禁用,直到另一个断点被击中,而这还没有发生时, 该断点被标记为非活动/依赖性。
Muted所有的断点都是暂时不活动的,因为它们已经被静止了。
Disabled该断点暂时不活动,因为它已被禁用。
Non-suspending为该断点设置了暂停策略,因此,当击中该断点时不会暂停执行。

图标:
在这里插入图片描述

6. 断点窗口操作

主调试窗口
在这里插入图片描述
服务整体控制按钮

  1. Rerun ‘XXX’:重新运行服务
  2. Modify Run Configuration…:修改服务运行配置
  3. Resume Program:执行到下一个断点
  4. Stop ‘XXX’:停止服务
  5. View Breakpoints…:查看断点配置
  6. Mute Breakpoints:让所有断点静音

主要调试按钮

  1. Show Execution Point(Alt+F10):跳转到当前执行的断点所在代码位置。
  2. Step Over(F8):下一步,一步一步地执行,如果下一行调用了方法,不会进入到方法内部。
  3. Step Into(F7):进入方法里。
  4. Force Step Into(Alt+Shift+F7):强制进入任何方法,可用于查看底层源码,用于调试进入官方类库方法。
  5. Step Out(Shift+F8):退出当前方法
  6. Drop Frame:回退到上一步(只能从当前方法的首行回退到上个方法的调用处)
  7. Run to Cursor (鼠标右键选择Run to Cursor或者Alt+F9):断点模式下运行到鼠标所在行。
  8. Evaluate Expression (Alt+F8):计算表达式(可运行查看变量的值,或者执行某些语句直接预览结果)

线程调试窗口
在这里插入图片描述
可用于调试多线程程序,还可选择内存窗口(能粗略查看内存占用情况)、负载窗口。

TIPS:
代码调试内存分析

  1. 可通过debugger配置,添加内存分析工具,能较清晰地查看每个对象占用的估算内存。
    在这里插入图片描述
  2. 在调试窗口点击鼠标右键点击某个对象,选择Calculate Retained Size…来计算对象的浅大小及保留大小。
    这在估算重型单体或从磁盘上读取的数据(例如,复杂的JSON)的内存占用时,可能很有用。另外,在决定使用哪种数据结构时(例如,ArrayList与LinkedList),这也很有用。
    在运行应用程序之前,确保在设置/首选项|构建、执行、部署|调试器中启用“附加内存代理”选项。 在查看类的实例时,右键单击一个实例并单击计算保留大小。

    在这里插入图片描述
    在这里插入图片描述

    注意:
    对象浅大小Shallow size指该对象本身的大小,可以理解为保存该’数据结构’需要多少内存(不包括引用的内容)。
    对象保留大小Calculate Retained Size指当对象被回收时, 可以同时被回收的对象的浅大小的和。
    例如:A,B,C,D,E。其中A成员变量引用B和C,D成员变量引用C和E。A的浅大小为A本身大小,A的保留大小为A+B的大小,C由于被D引用不能被回收,所以C得大小不计算在内

7. 远程调试

  1. 打开Idea的 Run/Debug Configurations 新增一个Remote
    JVM参数添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
    在这里插入图片描述
  2. 远程项目启动添加参数
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
  1. idea启动remote,并打断点调试

8. 生产力建议

  • 使用断点进行 "printf "调试使用非暂停的日志断点,而不是在代码中插入打印语句。这为处理调试日志信息提供了一种更灵活和集中的方式。
    场景:所有需要打印的地方,生产上禁止 System.out.print();
  • 调试无响应的应用程序
    如果你的应用程序挂起,暂停会话,让调试器获得关于其当前状态的信息。然后可以检查程序的状态并找出问题的原因。
    场景:项目启动卡死等处理
  • 测试程序是否有并发性问题
    发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值