目录
远程调试
Centos
JDK
工程
启动配置
IDE连接
调试
停止调试
远程调试原理
原理
三种通信方式
Debug参数
第1种Socket Attach调试方法
第2种Socket Listen调试方法
第3种调试方法
断点分类
条件断点
异常断点
附录
Tomcat远程调试配置
1.7之后命令
远程调试底层:JPDA
Tcping ping端口工具
内存和线程监控
Linux后台启动jar
IDEA远程调试
端口
项目端口:8888
JVM调试端口:8000
目录:挂载
f:/application1 文件夹
IP 设置
IP就使用自己机器IP
创建容器
docker create -it --name application1 -p 8888:8888 -p 8000:8000 -v /f/application1:/opt/application1 centos:6.8 /bin/bash
启动容器
docker start application1
进入容器
docker attach application1
安装
yum install java-1.8.0-openjdk
验证
java -version
SpringBoot工程,代码只是为了测试。
URL:http://127.0.0.1:8888/fun1
返回:{"code":1,"message":"ok"}
Jar包名称:demo-0.0.1-SNAPSHOT.jar
@RestController
public class TestConstrller {
private static int count = 0 ;
@GetMapping(value ="/fun1",produces = "application/json;charset=UTF-8")
@ResponseBody
public Response fun1(){
System.out.println("-----------------"+(++count)+"---------------------");
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
System.out.println("--------------------------------------");
return new Response(count,"ok");
}
}
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=127.0.0.1:8000,suspend=n -jar demo-0.0.1-SNAPSHOT.jar
在程序的JVM启动参数加入如下Debug参数:
-Xdebug 启用调试
-Xrunjdwp 加载JDWP的JPDA参考执行实例
transport 用于在调试程序和JVM使用的进程之间通讯
dt_socket 套接字传输
address=8000调试服务器的端口号,客户端用来连接服务器的端口号
server=y/n JVM是否需要作为调试服务器执行
suspend=y/n 是否在调试客户端建立连接之后启动JVM 。
启动工程:
工程右键 --> Debug --> Debug Configuration --> Remote Java Application
说明:
正常调用,第一次连接的时候可能稍微长点。
调用地址:http://127.0.0.1:8888/fun1
就注意一点就行了,当鼠标放到下图红框按钮上时出现Disconnect,显然是断开远程连接的按钮。当该按钮亮时说明正在远程debug,当像旁边按钮一样灰色时说明,远程debug连接已经断开。
1. Java都是编译成class文件,运行在不同环境的JVM之上的
2. 两个JVM之间是可以通信的,协议:JDWP(Java Debug Wire Protocol)
3. 连接方式Socket
4. 连接后 运行的是Eclipse中的Demo工程
5. 原则上两边的代码必须一致,也可以稍微有点差别
6. 下边选择的是Eclipse调试,并不是只有Eclipse,Idea也可以。
远程调试Java代码的三种方法,
1. 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试;
2. 第2种方法可以调试Java程序启动过程,但是Eclipse不能随时连接到远程Java程序进行调试;
3. 第3种方法可以同时具备上面两种的优点,在调试Java程序启动过程后,即使断开后Eclipse还是可以随时连接到远程Java程序进行调试。
在实际使用过程,一般使用第1种调试方法,
在需要调试Java程序启动过程的时候,才会使用第3种方法,
第3种和第1种方法的区别只是在于suspend=y/n,
第2种方法一般很少使用。
前两种通信图
1. 图片下半部分是第1种Socket Attach类型,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;。
2. 图片上半部分是第2种Socket Listen类型,表示Eclispe调试器先启动监听,JVM启动时主动连接调试器。
在程序的JVM启动参数加入如下Debug参数:
-Xdebug -Xrunjdwp:transport=dt_socket,address=1088,server=y,suspend=n
参数说明:
-Xdebug 启用调试
-Xrunjdwp 加载JDWP的JPDA参考执行实例
transport 用于在调试程序和JVM使用的进程之间通讯
dt_socket 套接字传输
address=1088 调试服务器的端口号,客户端用来连接服务器的端口号
server=y/n JVM是否需要作为调试服务器执行
suspend=y/n 是否在调试客户端建立连接之后启动JVM 。
远程JVM的Debug参数配置:
-Xdebug -Xrunjdwp:transport=dt_socket,address=1088,server=y,suspend=n
注意suspend=n,表示立即启动JVM,不等待调试客户端建立连接。
Eclipse调试器配置:
Eclipse -> Run -> Debug Configurations... -> Remote Java Application -> 右键点击New
打开一个默认名为New_configuration的调试配置界面,如下:
Connection Type: Socket Attach
Host: localhost (远程Java程序所在的主机IP)
Port: 1088 (远程Java程序的调试端口)
点击Debug即可连接到已经启动的远程Java程序进行调试,
但是不能调试Java程序启动过程。
远程JVM的Debug参数配置:
-agentlib:jdwp=transport=dt_socket,suspend=y,address=192.168.0.1:1088
注意address需要填写Eclipse调试器所在的IP地址和Port端口。
Eclipse -> Run -> Debug Configurations... -> Remote Java Application -> 右键点击New
打开一个默认名为New_configuration的调试配置界面,如下:
Connection Type: Socket Listen
Port: 1088 (远程调试端口)
点击Debug先启动Eclipse监听,
然后启动远程JVM程序,会主动Eclipse调试器进行调试,
这种方法可以调试Java程序启动过程,
但是不能随时连接到远程java程序进行调试。
第3种调试方法和第1中调试方法类似,
区别在于远程JVM的Debug参数中suspend=y:
-Xdebug -Xrunjdwp:transport=dt_socket,address=1088,server=y,suspend=y
具体流程是先启动远程的Java程序,
但此时JVM不会真正启动,会等待调试客户端建立连接之后再启动JVM,
然后参考第一种方法启动Eclipse的Socket Attach类型调试器,
此时JVM会真正的启动,而且已经连接上Eclipse的调试器,
可以调试Java程序启动过程,而且即使断开后,
Eclipse还是可以随时连接到远程Java程序进行调试,
缺点在于必须启动Eclipse调试器监听,
否则会导致JVM程序无法启动一直在等待。
定义
当某一个条件成立的时候进入断点。
设置条件断点
http://localhost:8888/fun2
代码
@GetMapping(value ="/fun2",produces = "application/json;charset=UTF-8")
@ResponseBody
public Response fun2(){
System.out.println("------"+(++count)+"----------");
for(int i = 0 ; i<10;i++){
System.out.println(i); // 断点 i = 2的时候进入
}
system.out.println("-----------------------------");
return new Response(count,"ok");
}
调试图:
只有i=2的时候才进断点
定义
断点不仅可以设置在某一行,也可以针对整个工程进行设置。
假设你知道程序会在某个地方抛出NullPointerException,可是并不是每一次运行都会出现,就可以为工程设置异常断点。
设置异常断点
调试
http://localhost:8888/fun3
Window
startup.bat
在前面添加:SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
一行,不要断开。
Linux
在catalina.sh中的首行添加:
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
启动
启动~看是否弹出信息(一闪而过)
jdk1.7之后使用命令:
java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n -jar you-runnable-jar.jar
jdwp:是 Java Debug Wire Protocol的缩写
server=y表示是监听其他debugclient端的请求
address=8000表示服务会在端口号8000监听debug请求,客户端必须设置这个端口号才能进行dubug
suspend表示是否在调试客户端建立连接之后启动 VM。如果为y,那么当前的VM就是suspend直到有debug client连接进来才开始执行程序。如果你的程序不是服务器监听模式并且很快就执行完毕的,那么可以选择在y来阻塞它的启动。
参考地址
ping这个小工具大家都非常熟悉,但是他不能ping端口,当我们需要知道目的地址的某端口是否开放时,这时需要用到这个tcping小工具了,Windows没有自带这个小工具,需要自己下载下来,放到指定目录里面。
下载地址:点击打开链接
放到C:\Windows\System32这个文件夹下,测试如下:
配置
java -Djava.rmi.server.hostname=127.0.0.7 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8061 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar demo-0.0.1-SNAPSHOT.jar
-Djava.rmi.server.hostname 为你的主机ip地址
-Dcom.sun.management.jmxremote.port 为你的端口号,即:连接是需要的端口
jdk的bin目录下打开jvisualvm.exe
连接
主页
示例:nohup java -agentlib:jdwp=transport=dt_socket,address=8689,server=y,suspend=n -jar xx.jar > xx.log 2>&1 &
end