我们先来了解一些基础知识:
代码调试的本质:
- Java本地debug时,断点是打在Java文件上的,代码执行到断点处,jvm就会停下了。所以很多人都认为debug时jvm运行的就是Java文件,这是不对的。我们知道Java是需要编译成字节码文件,运行再jvm上的是编译后的class文件,并不是Java文件。那么问题就出现了,为什么断点打在了Java文件中,虚拟机是怎么知道何时暂停呢?通信!对,就是通信。本地运行的服务和ide进行通信,来确定断点位置。
- 原理:两个VM之间通过debug协议进行通信,两者之间可以通过socket通信。既然通过socket通信,那么就能够实现远程调试。
远程调试是jvm附带的功能,通过配置参数来进行开关。
远程服务器jvm启动参数添加如下命令:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address={port}
port是对外暴露的debug端口。这个端口需要配置再idea中。
如果是docker容器启动服务的话,这条命令配置再dockerFile文件中。同时要做好端口的映射。
配置客户端,即idea工具。
- 保证本地代码和远程服务器上的代码完全一致。这样才能保证断点正确匹配。
- 点 + 号,选择Remote JVM Debug
- 填写信息,填写完信息后,点击OK按钮,即配置完成。如下图所示
如果是docker启动的话:远程服务器的域名或ip:指的是宿主机的,不是docker容器的。端口是做完映射后的端口。
- 配置完成后,就是启动了。首先选择配置好的,然后点击后面的debug。
- 启动完成。如下提示,就是启动成功。
- 启动成功后,就是再需要的代码位置增加断点即可调试了。