Java调试器
主动调试与被动调试
远程调试分为主动连接调试,和被动连接调试:
- 主动连接调试:服务端配置监控端口,本地IDE连接远程监听端口进行调试, 一般调试问题用这种方式。
- 被动连接调试:本地IDE监听某端口,等待远程连接本地端口。 一般用于远程服务启动不了,启动时连接到本地调试分析。
Xdebug (不推荐)
主动调试
启动程序
可以把参数加添到环境变量中:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
JVM 激活远程调试的启动参数有JPDA_OPTS
和JAVA_OPTS
。其中JAVA_OPTS
是通常不建议使用的,
因为基于JAVA_OPTS
的参数设定会暴露给所有的 JVM 应用。
也可以直接加到java命令后面:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 \ -jar test.jar
-
-Xdebug
:是通知JVM工作在DEBUG模式下, -
-Xrunjdwp
:是通知JVM使用(java debug wire protocol)来运行调试环境。 -
transport
:是监听Socket端口连接方式(也可以dt_shmem共享内存方式, 但限于windows机器,并且服务提供端和调试端只能位于同一台机)。 -
server=y
:表示当前是调试服务端,=n
表示当前是调试客户端。 -
suspend=n
:表示启动时不中断(如果启动时中断,一般用于调试启动不了的问题)。 -
address=8000
:表示本地监听8000端口。
IDE连接
本地Eclipse对需要调试的地方打上断点,然后项目右键启动远程调试:
Debug as
-> Debug Configurations
-> Remote Java Application
。
- Host为远程主机IP,
- Port为远程监听调试端口,
- Connection Type为:Standard(Socket Attach)
点击Debug,然后打断点,远程服务运行到断点处本地就会中断,然后进行调试。
被动连接调试
IDE开启监听
首先Eclipse配置监听,Connection Type选择:Standard(Socket Listen), 配置本地监听端口,比如默认8000。点击Debug开始等待远程连接调试。
启动程序时连接监听服务
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y"
如果是调试jar包,指令:
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar remoting-debug.jar
参数含义和主动连接调试一样,只是这里
-
suspend=y
表示启动时就中断,需要连接本地IDE调试启动。 -
address=ip:port
,ip需要修改为本地的对外IP。
这样远程项目启动时就连接到本地,方便调试项目启动不了的问题。
agentlib参数(推荐)
-Xdebug -Xrunjdw
是一种旧方式,适用于JVM 小于 JAVA 5.0 的版本(包括5.0),
而agentlib:jdwp
适用于 JAVA 5.0 和以后版本。
主动调试
启动程序
Linux setenv.sh
:
export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"
Windows setenv.bat
set JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"
-
transport=dt_socket
指定运行的被调试应用和调试者之间的通信协议 -
address=1043
远程被调试应用开通的端口 -
server=y
表示这个 JVM 即将被调试,suspend=n
用来告知 JVM 立即执行, 不要等待未来将要附着上/连上(attached)的调试者。如果设成y
, 则应用将暂停 不运行,直到有调试者连接。
suspend=y
的一个比较适用的场景是,当debug一个会阻止应用成功启动的问题时,通过
suspend=y
可以确保调试者连上来之后再启动应用,否则应用已经启动报错了再调试也
没意义了
使用IDE调试
(略)
Java调试工具
自制Java调试工具
如何自己写Java/Scala调试器:how.to.write.your.own.java.scala.debugger
深入 Java 调试体系: 第 1 部分,JPDA 体系概览:
深入 Java 调试体系,第 2 部分: JVMTI 和 Agent 实现
深入 Java 调试体系,第 3 部分: JDWP 协议及实现
深入 Java 调试体系,第 4 部分: Java 调试接口(JDI)
https://www.cnblogs.com/gotodsp/p/7294487.html https://blog.csdn.net/iteye_17963/article/details/82637167 https://elvis4139.iteye.com/blog/2225299 https://liugang594.iteye.com/blog/1397811 https://blog.csdn.net/kisimple/article/details/43355209 https://blog.csdn.net/maritimesun/article/details/7724855 https://fanrey.iteye.com/blog/1580157 https://m635674608.iteye.com/blog/2265688 https://blog.csdn.net/wangshuminjava/article/details/79840731