关注公众号【1024个为什么】,及时接收最新推送文章!
本文截图中的图标仅供参考,不同版本的IDEA图标存在差异。
进入指定方法(非常实用)
shift + F7
当一行代码有多个方法时,常规 F7 会按顺序一层一层的进入方法,效率低。shift + F7 能够快速选择要进入的方法。
条件断点
在断点处右键,设定条件,只有在满足设定的条件时,才会暂停。通过下拉箭头还能切换历史条件。
光标断点
Alt + F9
debug 逻辑很长的方法,或者 debug 过程中提前查看某段逻辑时,临时想在某行代码暂停一次,不想加断点删断点,就可以直接把光标放在要暂停的那一行代码,Alt + F9 就能在光标位置暂停。
属性断点
在属性上加断点,运行到所有和此属性相关的代码都会暂停,适用于很大的类,且这个属性值可能在很多方法中变更。
方法断点
在方法上加断点,进入、退出 此方法时都会暂停。如果是接口方法,所有实现类中此方法都会自动加上断点,非常适用于多态场景下的 debug,不用先找到此方法的实现类,再加断点了。
Lambda 表达式断点
在 debug Lambda 表达式时,断点总会觉得很别扭,通过此方法,可以清晰看到 Lambda 表达式过程中的内容。
异常断点
捕获到某种异常后暂停,适用于捕获到某些自定义异常后暂停。
人工抛异常
在栈帧位置右键,选择 Throw Exception,人工抛出指定异常,适用于靠代码逻辑抛异常很复杂的场景。
退帧
debug 过程中,不小心走过了,又不想停掉重来一遍,可以使用 Drop Frame 回退到某一帧。
强制返回
执行到某一行代码,不想继续往下执行了,如果选择 Stop 结束 debug,此行代码还会被继续执行。如果当前行的代码也不想被执行,使用 Force Return 可以立即返回,适用于会修改数据库内容的场景。
预估表达式(Evaluate Expression)
Alt + F8
手动执行某个表达式,提前获知执行结果。通过下拉箭头还能切换历史执行语句。
栈帧导出
在写图文教程时可能会用到整个栈帧文字版内容,通过 Copy Stack 或者 Export Threads 可以获得栈帧/线程 文字版信息。
bind:375, ServerSocket (java.net)
<init>:237, ServerSocket (java.net)
<init>:128, ServerSocket (java.net)
main:70, TestController (com)
多线程 debug
远程 debug
某些问题不好本地复现,需要借助测试环境复现;
联调测试过程需要临时加日志排查、又不希望带到线上。
步骤:
1) 修改服务端启动脚本(一般是 xxstart.sh),增加JVM启动参数配置(端口自己指定),重启服务
-Xdebug -Xrunjdwp:transport=dt_socket,address=8987,server=y,suspend=n
2) 本地代码和远程服务所部署的代码要一样(不一样调试就没意义了),Run --> Edit Configurations --> 配置远程的ip,端口(和服务端的相同)
3) 本地以Debug模式启动,出现下图信息,表示连接成功,只要有请求走到你断点的代码,就可以按平时Debug一样操作了。
注意!!!
本地断点会影响服务端的代码执行,如果有其他的测试请求进来会被阻塞,影响其他人的测试。
两种解决方案:
第一、可以找一个流量少的环境,但也不能保证不影响其他人的测试;
第二、借助Debug的条件断点功能,可以保证只有自己的请求进入断点(肯定有个唯一条件能确定是自己发的请求)。
原创不易,多多关注,一键三连,感谢支持!