Eclipse调试进阶-结合Dubbo调试实例分析

来源:互联网 发布:重生之网络崛起qq 编辑:程序博客网 时间:2024/05/18 02:26

本文你会掌握的Eclipse进阶技能:

● 调试窗口里默认显示多线程
● 根据需要暂停某线程,然后在需要时候恢复
● 使用Expression运行代码直观计算复杂的条件值
● Step Into(F5)
● Step Over (F6)
● Step Return (F7)
● Drop to Frame
● Use Step Filters

Dubbo Demo 调试运行时候 Eclipse界面显示:

这里写图片描述

调试注意:

1) 启动测试用例DemoProvider时候,该程序在某些地方会启动多线程(例如某些后台监控heartbeat线程)。因此从入口开始启动后不要以为程序是单线程运行的,特别是调试程序时候如果习惯断点打得多,要注意Eclipse界面停顿的地方究竟是你关心的主线程还是其它监控线程。

2) 可以根据需要暂停(Suspend)某些条监控线程,目的是方便针对关心的主线程观察日志,不至于在观察主线程代码流程时候突然跳转到某监控线程的代码片段。

暂停heartbeat线程
这里写图片描述

3)右键选择Watch监控打开表达式界面,在Expressions窗口的Name里可以填当前运行代码复杂的条件,例如( lastWrite != null && now - lastWrite > heartbeat ) 想直观知道答案而非逐个变量心算结果
这里写图片描述

这里写图片描述


下面介绍的功能使用中如遇到手动breakpoints,则调试跳转以手动增加的breakpoint为优先级处理。

● Step Into(F5)
● Step Over (F6)
● Step Return (F7)
● Drop to Frame
● Use Step Filters

4) 例如,下面代码当前运行在第一行,
第1行: for (Container container : containers) {
第2行: container.start();
第3行: logger.info(“Dubbo ” + container.getClass().getSimpleName() + ” started!”);
第4行: }

点击F6则按照顺序运行到第2行。
此时,
操作:点击F5就会进入到container.start()的具体代码里。
or
操作: 点击F6就运行到第3行。注意,如果container.start()方法里存在手工添加breakpoint,则F6也会进入start()方法体里。

5)假设按上面操作当前运行到start()方法体里下面第3行。
class Container {
public void start() {
第1行: String configPath = ConfigUtils.getProperty(SPRING_CONFIG);
第2行: if (configPath == null || configPath.length() == 0) {
第3行: configPath = DEFAULT_SPRING_CONFIG;
第..行: … … … …
第..行: … … … …
第n行: }
}
}

接着,由于还有很多行要执行,此时不希望不停按F6,那么可以直接点击F7执行完方法体里剩下代码然后返回到4)中例子的第2行

6)假设按上面步骤运行到例子4)中第3行,这时候如果希望程序返回到第1行重新运行一次,可以在调试的主窗口stack里选择for (Container container : containers) {这行然后点击Drop to Frame 即可。

7) Use Step Filters 用法就是不希望运行某个指定的代码。这个一般意义不大,但用得上时候又很方便。
场景如下:
windows -> preference -> Step Filtering 引入某个不希望调试的class
这里写图片描述

例如添加例子5)中的class Container,然后在调试窗口点按下面小图标。
这里写图片描述

则程序运行至第2行时候,点击F5 Step into不会生效,会直接运行到第3行。
第1行: for (Container container : containers) {
第2行: container.start();
第3行: logger.info(“Dubbo ” + container.getClass().getSimpleName() + ” started!”);
第4行: }

这个Use Step Filters 大部分情况下意义不大是因为很多时候在class Container 的start 方法里已存在手工添加的breakpoint,则无论按F5,F6程序都会跳转到该breakpoint

但是,如果是下面的场景,使用Use Step Filters却带来某些方便。

例如某些复杂嵌套方法只有一行代码,这时候如果我只关心进入obj1.method的方法体而不进入obj2,obj3的method方法体。最直接方法就是添加obj2,obj3为 filters
然后运行到下面代码时候,F5 Step into就只会进入obj1的method,省去先进入obj3,obj2的过程。
obj1.method(obj2.method(obj3.method()))

1 0
原创粉丝点击