Jade Dungeon

Java调试器

主动调试与被动调试

远程调试分为主动连接调试,和被动连接调试:

  • 主动连接调试:服务端配置监控端口,本地IDE连接远程监听端口进行调试, 一般调试问题用这种方式。
  • 被动连接调试:本地IDE监听某端口,等待远程连接本地端口。 一般用于远程服务启动不了,启动时连接到本地调试分析。

Xdebug (不推荐)

主动调试

启动程序

可以把参数加添到环境变量中:

JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"

JVM 激活远程调试的启动参数有JPDA_OPTSJAVA_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调试工具

gdb

eclipse.debug

自制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