远程调试,特别是当你在本地开发的时候,需要调试服务器上的程序时,远程调试就显的非常有用。知其然知其所以然,首先,为什么可以进行远程调试,背后的原理是什么?
Java程序执行过程可以分为一下几个步骤:Java文件--->编译生成类文件(class文件)-->JVM加载类文件-->JVM运行类字节码文件-->JVM翻译成各个机器认识的不同的机器码。
远程调试原理
我们知道Java程序是运行在Java虚拟机(JVM)上的,具有良好的跨平台性,是因为Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信,另外需要注意:被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题。
这个架构实质还是JVM,只要确保本地的Java源代码与目标应用程序一致,本地的Java的源码就可以用插座连接到远端的JVM,进而执行调试。因此,在这种插座连接模式下,本地只需要有源码,本地的Java的应用程序根本不用启动。
传输方式,默认为Socket ;
套接字:MACOS,Linux的系统使用此种传输方式;
共享内存:WINDOWS系统使用此种传输方式。
调试模式,默认为Attach ;
Attach :此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;
Socket :此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。
准备启动脚本
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 remote-debug-1.0-SNAPSHOT.jar
使用 java -jar 的方式启动程序,并且添加了一串特殊的参数,这是我们能够开启远程 debug 的关键,以
-
开头的参数是 jvm 的标准启动参数,关于 jvm 启动参数相关的知识可以先去其他博客了解。-agentlib:libname[=options], 用于装载本地 lib 包。在这条指令中便是加载了 jdwp(Java Debug Wire Protocol) 这个用于远程调试 java 的扩展包。而
transport=dt_socket,server=y,suspend=n,address=5005
这些便是 jdwp 装载时的定制参数,详细的参数作用可以搜索 jdwp 进行了解。我们需要关心的只有 address=5005这个参数选项,本地调试程序使用 5005端口与其通信,从而远程调试。
idea远程调试的配置
1.进入你的项目,找到Run这个菜单项,鼠标左键单击,弹出二级菜单,找到Edit Configurations并选择
2.以上操作会出现如下界面,如图所示,其中该界面的左侧为我们远程调试配置界面功能项,如果没有我们看接下里的操作,
在此界面,找到一个+号,点击弹出一个选项框,选择remote选项即可
如此,我们配置远程调试参数的界面如下所示,其中需要注意的是,远程调试的前提条件是需要在远程调试服务器端开启一个可以提供远程调试的端口
IDEA 配置
先执行脚本让远程的 jar 包跑起来,再在 IDEA 中运行 remote模式中设置的项目。
验证