Java Remote Debug(idea远程调试)

概述

对于分布式系统的调试不知道你们有什么好的方法。对于我来讲,在知道远程调试这个方法以前就是在代码中打各类log,而后从新部署,上线,调试,这样比较费时。今天我们来了解了解Java远程调试这个牛逼的功能,本文以Intellij IDEA为例讲解怎么使用远程调试。以Thrift入门教程这篇文章中使用的程序做为例子。这个程序由Thrift服务端和客户端组成。描述一下远程调试须要解决的问题:html

服务端程序运行在一台远程服务器上,咱们能够在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时可以在本地知道远程服务端的此时的内部状态。java

下面按照步骤介绍怎么远程debug。spring

使用特定JVM参数运行服务端代码

要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的JVM参数,这些参数是:bash

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}

其中的${debug_port}是用户自定义的,为debug端口,本例以5555端口为例。服务器

 

配置步骤

1.本地idea配置

打开Intellij IDEA,在顶部靠右的地方选择”Edit Configurations…”,进去以后点击+号,选择”Remote”,按照下图的只是填写红框内的内容,其中host为远程代码运行的机器的ip/hostname,port为上一步指定的debug_port,本例是5555
app

 

而后点击Apply,最后点击OK便可socket

注:其中host为远程服务器地址 Port为自定义端口分布式

 保留JVM参数(服务器配置时使用)ide

idea

 2.服务器配置

修改启动脚本(start.sh)--田间JVM参数
nohup /usr/java/jdk1.8.0_40/bin/java -jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y Appserver.jar --spring.config.locaton=./application.yml --logging.config=./logback.xml &

说明一下DEBUG选项参数的意思:

-XDebug 启用调试

-Xrunjdwp 加载JDWP的JPDA参考执行实例。
transport  用于在调试程序和 VM 使用的进程之间通信。
dt_socket 套接字传输。
server=y/n VM是否须要做为调试服务器执行。
address=2345调试服务器监听的端口号。
suspend=y/n 是否在调试客户端创建链接以后启动 VM 。

注:还有一个细节是-jar参数不能写到-Xug参数前,像这样没法启用调试(如图)
java -jar Appserver.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y

 

 

 3.idea启动debug模式

如今在上一步选择”Edit Configurations…”的下拉框的位置选择上一步建立的remote的名字,而后点击右边的debug按钮(长的像臭虫那个),看控制台日志,若是出现相似“Connected to the target VM, address: ‘xx.xx.xx.xx:5555’, transport: ‘socket’”的字样,就表示链接成功过了。

设置断点,开始调试

远程debug模式已经开启,如今能够在须要调试的代码中打断点了,好比:

如图中所示,若是断点内有√,则表示选取的断点正确。

如今在本地发送一个到远程服务器的请求,看本地控制台的bug界面,划到debugger这个标签,能够看到当前远程服务的内部状态(各类变量)已经所有显示出来了,而且在刚才设置了断点的地方,也显示了该行的变量值。

 

参考

https://blog.csdn.net/helllochun/article/details/40890277

https://www.cnblogs.com/wy2325/p/5600232.html

idea2019:

https://www.cnblogs.com/virgosnail/p/10560738.html