【Java】Debug断点调试常用技巧
Debug操作技巧
Show Execution Point
将光标回到当前断点停顿的地方
Step Over
执行当前行代码,并将运行进度跳转到下一行。
Step Into
进入到当前代码行的方法内部。
Step Out
从方法内部出去
Force Step Into
强制进入Java自带方法的内部
Run to Cursor
将光标定位到想到达的代码行
点击Run to Cursor
Drop Frame
丢弃当前虚拟机栈帧
初始:
进入方法:
丢弃当前帧:
也就是说,我们退回了上一步进入方法之前。
Evaluate Expression
可以用它来评估表达式
如 p.getName()等。
Force Return | 避免操作资源
我们在调试代码的时候中间出现了异常,但是我们又没有做异常捕获,稀里糊涂地把错误数据存到了数据库中,我们又需要将这些数据给删除,将数据库复原,才能达到之前我们需要的效果。
所以,接下来我们讲一讲如何避免操作资源,强制返回。
public static void saveResource() {
System.out.println("shit happens");
System.out.println("save to db");
System.out.println("save to redis");
System.out.println("send message to mq for money payout");
}
debug:
我们发现程序出现了异常
Force Return
它会只打印shit happens,不会继续向下执行了。
Trace Current Stream Chain | Stream Debug
public static void streamDebug() {
// stream chain
Arrays.asList(1, 2, 3, 45).stream()
.filter(i -> i % 2 == 0 || i % 3 == 0)
.map(i -> i * i)
.forEach(System.out::print);
}
左下角平铺模式Flat Mode:
断点常用技巧
断点(Breakpoint)
断点:如果把程序想象成一条平滑的线,那么断点就是一个结,可以让程序中断在需要的地方,从而方便其分析。
设置断点:在代码里需要调试的地方,鼠标双击代码行号的左边,再次双击即可取消断点。
在调试中可以设置的断点类型有五种:
行断点:
spring在注册Bean定义(registerBeanDefinition)时,如果是org.springframework.demo.MyBean,就挂起线程,可以开始单步调试了。
对于命中次数(hit count)的使用,一般是在循环中,第N个对象的处理有问题,设置hit count = N, 重调试时,可以方便到达需要调试的循环次数时,停下来调试。方法断点:
方法断点的好处是可以从方法方法进入或者退出时停下来调试,类似行断点,而且只有行断点和方法断点有条件和访问次数的设置功能。
但是方法断点还有另外一个好处,如果代码编译时,指定不携带调试信息,行断点是不起作用的,只能打方法断点。
有兴趣的可以将Add line number…前的勾去掉,调试下看看。观察断点:
在成员变量上打的断点。只有对象成员变量有效果,静态成员变量不起作用。
可以设置变量被访问或者设置的时候挂起线程/VM。异常断点:
系统发生异常时,在被捕获异常的抛出位置处或者程序未捕获的异常抛出处挂起线程/VM, 也可以指定是否包括异常的子类也被检测。类加载断点:
在类名上打的断点。接口上是打不了类加载断点的,但是抽象类是可以的,只是在调试的时候,断点不会明显进入classloader中,单步进入知会进入到子类的构造方法中,非抽象类在挂起线程后单步进入就会到classloader中(如果没有filter过滤掉的话)。类加载断点不管是打在抽象或者非抽象类上,都会在类第一次加载或者第一个子类第一次被加载时,挂起线程/VM。
注意:每种断点的设置有些许不一样,可以在断点上右键->Breakpoint properties进行设置,但一般在断点窗口有快速设置的界面,Breakpoint properties中多了filter, 其实比较鸡肋,用处不大。
调试状态
启动服务开始调试:
- 方法一:例如上图的代码中,鼠标点击main方法-->右键Debug As-->Java Application开始java代码调试;
- 方法二:直接点击“调试”按钮,即点击小瓢虫边上的倒三角,选择Debug As-->Java Application;
方法三:快捷键F11;方法四,菜单栏选择Run-->Debug,还有其他方法此处不再赘述了。
开发工具首次调试会弹出提示,需要切换到Debug工作区,勾选“Remember my decision”,下次便不再提示。
调试执行:
功能 | 快捷键 | 描述 | 备注 |
---|---|---|---|
Step Info | F5 | 单步进入(如果有方法调用,将进入调用方法中进行调试) | 逐语句 |
Step Over | F6 | 单步跳过(不进入行的任何方法调用中,直接执行完当前代码行,并跳到下一行) | 逐过程 |
Step Return | F7 单步返回(执行完当前方法,并从调用栈中弹出当前方法,返回当前方法被调用处) | 跳出 | |
Resume | F8 | 恢复正常执行(直到遇到下一个断点) | 继续运行 |
Run to Line | Ctrl+R | 执行到当前行(将忽略中间所有断点,执行到当前光标所在行) | |
Drop To Frame | 无 | 回退到指定方法开始处执行,这个功能相当赞。 在方法调用栈上的某个方法右键,选择Drop To Frame就可以从该方法的开始处执行,比如 重新执行本方法,可以在本方法上用Drop To Frame,将从本方法的第一行重新执行。 当然对于有副作用的方法,比如 数据库操作,更改传入参数的对象内容等操作可能重新执行就不再是你想要的内容了。 |
|
Copy Stack | 无 | 拷贝当前线程栈信息 |
断点
public class BreakPointDemo {
// 行断点
public static void line() {
System.out.println("this is the line break point");
}
// 详细断点(源断点)
public static void detailLine() {
System.out.println("this is the detail line break point");
}
// 方法断点 | 接口跳转实现类
public static void method() {
System.out.println("this is from method");
IService iservice = new IServiceImpl();
iservice.execute();
}
// 异常断点 | 全局捕获
public static void exception() {
Object o = null;
o.toString();
System.out.println("this line will never be print!");
}
// 字段断点 | 读写监控
public static void field() {
Person p = new Person("field", 10);
p.setAge(12);
System.out.println(p);
}
public static void main(String[] args) {
line();
detailLine();
method();
exception();
field();
}
}
行断点
// 行断点
public static void line() {
System.out.println("this is the line break point");
}
使用鼠标左键点击代码左侧:
右键点击行断点,我们也可以进行一些断点停顿的条件设置:
如 i == 20等条件。
Suspend也可以选择线程模式,我们可以切换不同的线程,来观察不同线程的该语句的运行效果。(如果是All的话,那就是哪一个线程先过来,那就是哪个线程)
详细断点
// 详细断点(源断点)
public static void detailLine() {
System.out.println("this is the detail line break point");
}
SHIFT+鼠标左键:
debug:
方法断点 | 接口跳转实现类
方法断点 = 方法起始行断点 + 方法结尾行断点
// 方法断点 | 接口跳转实现类
public static void method() {
System.out.println("this is from method");
IService iservice = new IServiceImpl();
iservice.execute();
}
在方法上打断点:
debug:
第一个断点停留在方法体内第一行代码:
第二个断点停留在方法体内返回的最后一行代码:
在接口方法上打断点:
真正运行的是接口方法的实现类:
如果我们有很多的实现类,我们具体不知道是哪一个,我们只需要在接口方法上打一个断点,它就会自动地跳到接口具体的实现类方法上。
异常断点 | 全局捕获
// 异常断点 | 全局捕获
public static void exception() {
Object o = null;
o.toString();
System.out.println("this line will never be print!");
}
异常断点会停顿在报出异常的具体代码行。
点击View Breakpoints
在异常断点处添加新的异常断点
接下来,只要你的程序遇到空指针异常,它就会停顿到发出空指针异常的那一行代码那里。
没有显式打断点:
debug:
这个异常断点对于我们异常调试很方便。
字段断点 | 读写监控
// 字段断点 | 读写监控
public static void field() {
Person p = new Person("field", 10);
p.setAge(12);
System.out.println(p);
}
在类的字段属性上打断点:
我们在字段左边打了一个字段断点(小眼睛),它就会去监控该字段属性的整个生命周期的值的变化。
dubug:
第一个:构造方法修改了属性值
第二个:setter方法修改了属性值
【Java】Debug断点调试常用技巧的更多相关文章
- JAVA debug 断点调试
更多调试参看 https://www.cnblogs.com/yjd_hycf_space/p/7483471.html 先编译好要调试的程序.1.设置断点 选定要设置断点的代码行,在行号的区域后面单 ...
- (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇
背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇
- Eclipse调试常用技巧(转)
Eclipse调试常用技巧 转自http://daimojingdeyu.iteye.com/blog/633824 1. 条件断点 断点大家都比较熟悉,在Eclipse Java 编辑区的行头双击就 ...
- debug断点调试
debug断点调试 1,虫子启动2,F6 执行断点的下一步,下一个语句 F5 进入方法 F8 执行到结束 查看表达式的值:选中查看的表达式,接着按 ctrl ...
- Intellij IDEA 2017 debug断点调试技巧与总结详解篇
转载自csdn----------------------------------------------------------------------https://blog.csdn.net/q ...
- myeclipse下对tomcat项目进行debug断点调试
对于eclipse或myeclipse调试J2SE项目或小应用进行断点调试,大家都不陌生,只要设置断点,debug运行就OK了.但是如果是web项目,而项目是在容器中运行的,比如tomcat,resi ...
- 关于Eclipse Debug断点调试出现 Search not found 页面的解决办法
1. 在代码中鼠标右键 Debug AS ---> Debug Configurations... ----> 找到Source选项 ---> 点击add ---> 选择 j ...
- Eclipse debug断点调试代码时出现source not found问题
偶尔调试代码的时候会出现这种事情,之前并没有特别注意,今天稍微搜集一下相关资料: 1.跳转到的代码的确没有源码,下载源码后选择源码位置后便会正常显示源码. 2.源码和class文件不一致.即便勾选了a ...
- 解决Eclipse Debug 断点调试的source not found问题
写完代码进行调试的时候,经常会用到断点调试,一步步检测问题,但有时候eclipse有时候无法进入断点,这样就失去了断点的意义,原因是debug无法找到该项目的源代码,解决方法如下 1,打开debug ...
随机推荐
- 【python】Leetcode每日一题-最大数
[python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...
- HashMap实现原理一步一步分析(1-put方法源码整体过程)
各位同学大家好, 今天给大家分享一下HashMap内部的实现原理, 这一块也是在面试过程当中基础部分被问得比较多的一部分. 想要搞清楚HashMap内部的实现原理,我们需要先对一些基本的概念有一些了解 ...
- Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?
前言 说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口. 我们都知道,JDBC是Java语言中用来规范客户端程序如何来访 ...
- 有趣的css—简单的下雨效果2.0版
简单的下雨效果2.0版 前言 笔者上一篇发布的文章有趣的css-简单的下雨效果中有位老哥给我提了一个很棒的建议,大致意思是波纹应该产生于雨滴的消失处. 这是按照老哥的建议完善后的效果图: 由于我制作G ...
- [Python] 地图API
请求位置信息 https://restapi.amap.com/v3/place/text?keywords=北京大学&city=beijing&output=xml&offs ...
- [物联网] 电气 & 工控
原理 一次回路和二次回路 一次回路:强电部分(380伏---22万伏),连接发电机.电动机.变压器.电网线路.电网开关.电网避雷器等等 二次回路:弱电部分,指的是控制线路.保护线路.测量线路.计量线路 ...
- [Scala] 高级特性
泛型 泛型类 1 package day0603 2 3 class GenericClassInt { 4 private var content:Int=10 5 def set(value:In ...
- setting>SSH>sessions setting>勾选ssh Keepalive[ MobaXterm】设置保持SSH连接
[ MobaXterm]设置保持SSH连接 ssh远程连接会在无操作时自动断开连接.为了保持程序运行和连接,需要设置保持连接. 1.MobaXterm如果使用了MobaXterm客户端,那么需要在设置 ...
- MySQL 查询操作
目录 基本语法 查询常量 查看表达式 查询函数 查询指定字段 查询所有列 列别名 表别名 条件查询 条件查询运算符 逻辑查询运算符 排序与分页 排序查询(order by) 排序方式 limit 分组 ...
- java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...