背景
一直以来,在IDEA上使用debug工具都只会单步调试,连调试的时候使用表达式都是看同事操作才刚学会。对于java程序员来说,对于IDEA的使用度如此浅薄实在是说不过去。
最近看了一篇文章,写的简直太好了,对于每个功能都有详细介绍和动图示例。收获颇多,记录一下。
问答记录
由于文章中已经有很详细的介绍了,且读的过程非常顺畅,不需要重新写一篇文章,所以通过问答的方式记录一下收获。
(1)最主要的收获是什么
最主要的收获有:
a、知道了有四种断点:行断点、方法断点、属性断点、异常断点
行断点就是我们常用来做单步调试的断点
方法断点是打在方法上的,最好的场景是打在接口(或者父类?)的方法上,所有实现类的方法在执行时都会被激活
属性断点是打在成员变量或者静态变量上,可以在变量被赋值或者被使用的时候激活
异常断点是一个全局断点,如果有哪里抛出了该异常,都会被激活。这个非常适用于程序出现了异常,但有不知道具体是什么地方抛出的时候使用。
b、断点可以配置参数
每个断点都可以配置一些参数,比如触发时机、触发条件等
c、还有一些奇妙的用法
多线程调试的时候选择suspend all 和suspend thread是不一样的;java8的stream流调试有专门的可视化面板;在程序中可以主动抛出异常;
(2)JPDA和JDWP是什么
之前就想了解一下java的远程debug到底是什么实现的,没有找到相关的资料。这次顺便了解到了这个信息。主要参考文章
JPDA(Java Platform Debugger Architecture)其实就是java平台调试架构,它是由一组接口组成的,其作用就是来做远程debug。
JPDA的一组接口包括:JVMTI(JVM Tool Interface)、JDWP(Java Debug Wire Protocol)、JDI(Java Debug Interface)
JVMTI是在jvm上提供的一套native接口,这套接口提供的功能是查询JVM的状态、通过一些指令控制程序的运行。
JDWP是一个通讯协议,为JVMTI和JDI之间的通讯提供协议。
JDI是客户端进行调试的接口。
(3)JDWP漏洞
偶然发现一篇文章,说JDWP有漏洞,可能会被利用。所以线上程序不要开启debug端口、或者不要在公网开启debug。