5. 断点状态
状态 | 描述 |
---|---|
Verified | 启动调试器会话后,调试器会检查在技术上是否可以在断点处暂停程序。如果是,调试器将该断点标记为已验证。 |
Warning | 如果在技术上可以在断点处暂停程序,但是有相关的问题,调试器会给你一个警告。例如,这可能发生在无法在某个方法的实现处暂停程序的情况下。 |
Invalid | 如果在技术上不可能在断点处暂停程序,调试器会将其标记为无效。最常见的原因是该行没有可执行的代码。 |
Inactive/dependent | 当一个断点被配置为禁用,直到另一个断点被击中,而这还没有发生时, 该断点被标记为非活动/依赖性。 |
Muted | 所有的断点都是暂时不活动的,因为它们已经被静止了。 |
Disabled | 该断点暂时不活动,因为它已被禁用。 |
Non-suspending | 为该断点设置了暂停策略,因此,当击中该断点时不会暂停执行。 |
图标:
6. 断点窗口操作
主调试窗口
服务整体控制按钮
- Rerun ‘XXX’:重新运行服务
- Modify Run Configuration…:修改服务运行配置
- Resume Program:执行到下一个断点
- Stop ‘XXX’:停止服务
- View Breakpoints…:查看断点配置
- Mute Breakpoints:让所有断点静音
主要调试按钮
- Show Execution Point(Alt+F10):跳转到当前执行的断点所在代码位置。
- Step Over(F8):下一步,一步一步地执行,如果下一行调用了方法,不会进入到方法内部。
- Step Into(F7):进入方法里。
- Force Step Into(Alt+Shift+F7):强制进入任何方法,可用于查看底层源码,用于调试进入官方类库方法。
- Step Out(Shift+F8):退出当前方法
- Drop Frame:回退到上一步(只能从当前方法的首行回退到上个方法的调用处)
- Run to Cursor (鼠标右键选择Run to Cursor或者Alt+F9):断点模式下运行到鼠标所在行。
- Evaluate Expression (Alt+F8):计算表达式(可运行查看变量的值,或者执行某些语句直接预览结果)
线程调试窗口
可用于调试多线程程序,还可选择内存窗口(能粗略查看内存占用情况)、负载窗口。
TIPS:
代码调试内存分析
- 可通过debugger配置,添加内存分析工具,能较清晰地查看每个对象占用的估算内存。
- 在调试窗口点击鼠标右键点击某个对象,选择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. 远程调试
- 打开Idea的 Run/Debug Configurations 新增一个Remote
JVM参数添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 远程项目启动添加参数
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
- idea启动remote,并打断点调试
8. 生产力建议
- 使用断点进行 "printf "调试使用非暂停的日志断点,而不是在代码中插入打印语句。这为处理调试日志信息提供了一种更灵活和集中的方式。
场景:所有需要打印的地方,生产上禁止 System.out.print(); - 调试无响应的应用程序
如果你的应用程序挂起,暂停会话,让调试器获得关于其当前状态的信息。然后可以检查程序的状态并找出问题的原因。
场景:项目启动卡死等处理 - 测试程序是否有并发性问题
发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。