代码调试

非 Y 不嫁゛ 提交于 2020-01-24 22:52:36

1. 条件断点

IDEA 可以设置指定条件的断点,增加我们调试的效率。

public class Test {
    public static void main(String[] args) {
        for (int i = 0; i <= 100; i++) {
            System.out.println(i);
        }
    }
}

2、在 System.out.println(i);这句话的左侧单击一下,出现一个红色的点,即为断点 

3、右击断点,弹出如下对话框,在Condition 框里输入条件 i==66 

4、运行debug,进入断点的那一刻,就是 i 等于66的时候

5、第3步的图片上看到的那个快捷键【Ctrl+Shift+F8】,打开后如下图,就是查看所有断点详情的对话框

除了使用快捷键以外,还可以直接在Debug 面板中,点击下图的这个标志(两个断点的标志)

2. 强制返回

IDEA 可以在打断点的方法栈处,强制返回你想要的方法返回值给调用方。非常灵活!

3. 模拟异常

IDEA 可以在打断点的方法栈处,强制抛出异常给调用方。这个在调试源码的时候非常有用。

4. Evaluate Expression

IDEA 还可以在调试代码的时候,动态修改当前方法栈中变量的值,方便我们的调试。

快捷键: alt+f8

鼠标点击

5. 回到"上一步"

该技巧最适合特别复杂的方法套方法的场景,好不容易跑起来,一不小心手一抖,断点过去了,想回过头看看刚才的变量值,如果不知道该技巧,只能再跑一遍。

参考上图,method1方法调用method2,当前断点的位置j=100,点击上图红色箭头位置的Drop Frame图标后,时间穿越了

回到了method1刚开始调用的时候,变量i变成了99,没毛病吧,老铁们,是不是很6 :)

注:好奇心是人类进步的阶梯,如果想知道为啥这个功能叫Drop Frame,而不是类似Back To Previous 之类的,可以去翻翻JVM的书,JVM内部以栈帧为单位保存线程的运行状态,drop frame即扔掉当前运行的栈帧,这样当前“指针”的位置,就自然到了上一帧的位置。

6.  多线程调试

多线程同时运行时,谁先执行,谁后执行,完全是看CPU心情的,无法控制先后,运行时可能没什么问题,但是调试时就比较麻烦了,最明显的就是断点乱跳,一会儿停这个线程,一会儿停在另一个线程,比如下图:

如果想希望下一个断点位置是第2句诗句,可能要失望了:

如果想让线程在调试时,想按自己的愿意来,让它停在哪个线程就停在哪个线程,可以在图中3个断点的小红点上右击,

即:Suspend挂起的条件是按每个线程来,而非All。把这3个断点都这么设置后,再来一发试试

注意上图中的红框位置,断点停下来时,这个下拉框可以看到各个线程(注:给线程起个容易识别的名字是个好习惯!),我们可以选择线程“天空中的飞鸟”

断点如愿停在了第2句诗。

7. 远程调试

  • 菜单 -> Run -> Edit Configurations…

  • 添加 -> Remote

  • 配置

  • 启动远程项目

正常启动命令如下:

java -jar ***.jar

开启远程调试:

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7015 **.jar

其中 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7015 是从上一步方框里拷贝出来的

  • 注意事项

要保证远程调试监听的端口是放行状态

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!