【Java】Debug断点调试常用技巧 (3)

类加载断点:
在类名上打的断点。接口上是打不了类加载断点的,但是抽象类是可以的,只是在调试的时候,断点不会明显进入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”,下次便不再提示。

调试执行:

【Java】Debug断点调试常用技巧

功能 快捷键 描述 备注
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"); }

使用鼠标左键点击代码左侧:

image

右键点击行断点,我们也可以进行一些断点停顿的条件设置:

image

如 i == 20等条件。

Suspend也可以选择线程模式,我们可以切换不同的线程,来观察不同线程的该语句的运行效果。(如果是All的话,那就是哪一个线程先过来,那就是哪个线程)

image

详细断点 // 详细断点(源断点) public static void detailLine() { System.out.println("this is the detail line break point"); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysjff.html