jpda
(java platform debugger architecture),即 java 平台调试体系,具体结构图如下图所示。
其中实现调试功能的主要协议是jdwp
协议,在 java se 5
以前版本,jvm 端的实现接口是 jvmpi
(java virtual machine profiler interface),而在 java se 5
及以后版本,使用 jvmti
(java virtual machine tool interface) 来替代 jvmpi。
因此,如果使用 java se 5 之前版本,使用调试功能的命令为:
java -xdebug -xrunjdwp:...
java se 5
及之后版本,使用调试功能的命令为:java -agentlib:jdwp=...
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9091 -jar xxx.jar
dt_socket
:主要的方式,采用socket
方式连接。dt_shmem
:采用共享内存方式连接,仅支持 windows 平台。n
。y
,如果你想将当前应用作为客户端,作为调试的发起者,设置该值为n
。y
。n
,即不需要应用阻塞等待连接。一个可能为 y
的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。8000
。java -agentlib:jdwp=…
可用,单位为毫秒ms
。suspend = y
时,该值表示等待连接的超时;当 suspend = n
时,该值表示连接后的使用超时。-agentlib:jdwp=transport=dt_socket,server=y,address=8000
:以 socket 方式监听 8000 端口,程序启动阻塞(suspend 的默认值为 y)直到被连接。
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
:以 socket 方式监听 8000 端口,当程序启动后 5 秒无调试者连接的话终止,程序启动阻塞(suspend 的默认值为 y)直到被连接。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
:选择可用的共享内存连接地址并使用 stdout 打印,程序启动不阻塞。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
:以 socket 方式连接到 myhost:8000
上的调试程序,在连接成功前启动阻塞。
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.ioexception,launch=/usr/local/bin/debugstub
:以 socket 方式监听 8000 端口,程序启动阻塞(suspend 的默认值为 y)直到被连接。当抛出 ioexception 时中断调试,转而执行 usr/local/bin/debugstub
程序。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9190 -jar debug-demo.jar
出现下图的界面,表示运行成功:
然后在 idea 中,点击 edit configurations
,在弹框中点击 +
号,然后选择remote
。
填写服务器的地址及端口,点击 ok 即可。
配置完毕后,debug 调试运行即可。
配置完毕后点击保存即可,因为我配置的 suspend=n,因此服务端程序无需阻塞等待我们的连接。我们点击 idea 调试按钮,当我访问某一接口时,能够正常调试。
java面试题
即可免费获取。
如对本文有疑问, 点击进行留言回复!!
跟我学Springboot开发后端管理系统6:缓存框架Caffeine
《Oracle Java EE编程自学与面试指南》01-02、Web应用类型
Error: Avoided redundant navigation to current location: “/XXX“.的问题
Avoided redundant navigation to current location:
荐 四十一、Vue项目上手 | 用户管理系统 实现用户修改和删除功能(完成篇)
网友评论