文章目录
-
- 前言
- [1. Remote JVM Debug](#1. Remote JVM Debug)
- [2. 系统要求与环境准备](#2. 系统要求与环境准备)
-
- [2.1 服务器环境](#2.1 服务器环境)
- [2.2 本地开发环境](#2.2 本地开发环境)
- [3. 内网服务器准备及开始](#3. 内网服务器准备及开始)
-
- [3.1 安装cpolar配置支持远程ssh登录](#3.1 安装cpolar配置支持远程ssh登录)
-
- [3.1.1 什么是cpolar?](#3.1.1 什么是cpolar?)
- [3.1.2 安装cpolar](#3.1.2 安装cpolar)
- [3.1.3 注册及配置cpolar系统服务](#3.1.3 注册及配置cpolar系统服务)
- [3.1.4 登录cpolar web ui 管理界面配置ssh端口穿透](#3.1.4 登录cpolar web ui 管理界面配置ssh端口穿透)
-
- [3.1.4.1 放行9200端口](#3.1.4.1 放行9200端口)
- [3.1.4.2 访问cpolar web ui管理界面](#3.1.4.2 访问cpolar web ui管理界面)
- [3.1.4.3 保留固定TCP公网地址](#3.1.4.3 保留固定TCP公网地址)
- [3.1.4.4 启用ssh隧道,配置固定tcp地址](#3.1.4.4 启用ssh隧道,配置固定tcp地址)
- [3.1.4.5 使用固定的tcp地址进行远程ssh登录](#3.1.4.5 使用固定的tcp地址进行远程ssh登录)
- [3.2 安装JDK](#3.2 安装JDK)
- [3.3 上传打包好的Jar文件至服务器](#3.3 上传打包好的Jar文件至服务器)
-
- [3.3.1 打包springboot项目](#3.3.1 打包springboot项目)
- [3.3.2 上传至服务器](#3.3.2 上传至服务器)
- [4. 启动 JAR 文件并配置远程调试](#4. 启动 JAR 文件并配置远程调试)
-
- [4.1 启动 JAR 文件](#4.1 启动 JAR 文件)
- [4.2 cpolar隧道配置](#4.2 cpolar隧道配置)
-
- [4.2.1 http(8080端口)穿透](#4.2.1 http(8080端口)穿透)
- [4.2.2 调试端口(5005端口)穿透](#4.2.2 调试端口(5005端口)穿透)
-
- [4.2.2.1 保留固定tcp地址](#4.2.2.1 保留固定tcp地址)
- [4.2.2.2 创建新隧道](#4.2.2.2 创建新隧道)
- 5.IDEA远程Debug调试内网项目
-
- [5.1 idea配置remote jvm debug](#5.1 idea配置remote jvm debug)
- [5.2 启动及调试](#5.2 启动及调试)
- 6.可能出现的问题
-
- [6.1 访问页面出现404的情况是怎么回事?](#6.1 访问页面出现404的情况是怎么回事?)
- 7.总结
- 项目源码
- 7.总结
- 项目源码
前言
对于经常需要解决线上问题的开发者来说,RemoteJVMDebug就像一把精准的手术刀:它能在不停止服务的情况下深入JVM内部,观察变量变化,追踪异常堆栈,甚至修改代码逻辑验证修复方案。最令人称道的是它的"零侵入性"------调试过程对用户完全透明,不会影响服务正常运行。无论是定位偶发的空指针异常,还是分析复杂的线程死锁,这个工具都能让问题排查从"猜谜游戏"变成"精准打击"。
作为使用三年的资深用户,我特别欣赏它的三个特性:条件断点功能让调试只在特定场景触发,避免日志刷屏;变量监视窗口实时显示对象状态,比日志打印更直观;方法调用栈可视化帮助快速定位问题根源。记得有次线上服务出现内存泄漏,正是通过RemoteJVMDebug的内存分析功能,在不重启服务的情况下找到了缓存未释放的原因,挽回了数十万的潜在损失。
直到用cpolar打通远程调试通道,我才发现这项技术的真正潜力。现在即使出差在外,也能用笔记本连接公司内网服务器,断点调试如同坐在办公室一样流畅;客户现场演示出现异常时,无需等待日志回传,直接通过手机热点+cpolar进行实时诊断。最难忘的是去年春节假期,通过这种方式远程修复了一个支付系统的关键bug,避免了业务中断。这种"随时随地解决问题"的能力,让开发团队的响应速度提升了一个量级。
本文使用的示例项目已在GitHub开源,您可以直接获取完整代码进行学习和实践:
- GitHub仓库:https://github.com/TanChengBin/springboot-debug-test
- 项目特点:基于Spring Boot的远程调试测试项目,包含正常接口和异常接口,便于测试各种调试场景
1. Remote JVM Debug
Remote JVM Debug(远程JVM调试)是一种允许开发人员通过调试工具(如 IntelliJ IDEA)连接到运行在远程服务器上的Java应用程序并进行调试的技术。这个过程通常涉及通过网络连接到远程JVM实例,并允许开发者在不直接访问物理机器的情况下查看、修改代码状态,诊断和修复问题。
2. 系统要求与环境准备
2.1 服务器环境
- 内网服务器操作系统:Windows 或 Linux。
- JDK 版本:确保服务器上安装了正确版本的 JDK,支持远程调试。
- cpolar 安装:需要在内网服务器上安装 cpolar 客户端,用于穿透远程登录、调试端口及HTTP请求。
2.2 本地开发环境
- IDEA:本地开发机器需要安装 IntelliJ IDEA。
- JDK:本地开发机器需要安装 JDK(版本与远程服务器相同)。
3. 内网服务器准备及开始
由于大部分项目基本部署在Linux服务器中,因为Linux的性能更优,占用更低。所以本文采用的模拟内网服务器为Linux的CentOS7
系统。
3.1 安装cpolar配置支持远程ssh登录
此步骤需提前在内网服务器中操作,以支持在家远程登录公司测试环境中的内网服务器
3.1.1 什么是cpolar?
- cpolar 是一款内网穿透工具,可以将你在局域网内运行的服务(如本地 Web 服务器、SSH、远程桌面等)通过一条安全加密的中间隧道映射至公网,让外部设备无需配置路由器即可访问。
- 广泛支持 Windows、macOS、Linux、树莓派、群晖 NAS 等平台,并提供一键安装脚本方便部署。
3.1.2 安装cpolar
首先,我们需要先安装curl:
shell
sudo yum install curl
Bash
接下来下载cpolar,一条命令完成安装
shell
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
Bash

测试cpolar
版本以确保安装
shell
cploar version
Bash

3.1.3 注册及配置cpolar系统服务
进入cpolar官网,点击免费注册
按钮进行注册一个账号

向系统添加及启动cpolar服务
shell
#添加cpolar服务
sudo systemctl enable cpolar
#启动cpolar服务
sudo systemctl start cpolar
Bash

查看服务状态
shell
sudo systemctl status cpolar
Bash

3.1.4 登录cpolar web ui 管理界面配置ssh端口穿透
3.1.4.1 放行9200端口
在访问web页面前,需要先检查系统防火墙是否放行9200端口,避免访问不了
shell
systemctl status firewalld
Bash

有两种方式可以实现访问,一种是放行该端口,另一种是直接关闭防火墙(不建议)
shell
#放行 9200 端口
#--zone=public:使用默认区域(通常是 public)
#--add-port=9200/tcp:添加 TCP 协议的 9200 端口
#--permanent:永久生效(不加此参数则是临时规则,重启失效)
firewall-cmd --zone=public --add-port=9200/tcp --permanent
#重载防火墙配置(及刷新配置使其生效)
firewall-cmd --reload
Bash

验证端口是否已放行
shell
firewall-cmd --zone=public --query-port=9200/tcp
Bash

输出内容为yes则成功放行
3.1.4.2 访问cpolar web ui管理界面
在访问之前,不确定ip地址可以通过ifconfig
命令查看服务器ip
shell
ifconfig
Bash

确定好ip地址后,在浏览器中访问:
shell
http://<此处应为您的IP>:9200 #如:http://192.168.184.133:9200
Bash

将前面步骤注册好的cpolar账号登录即可进入后台页面

登录成功同时,服务器也会后台无感自动配置token,无需手动配置token
配置文件位置:/usr/local/etc/cpolar/cpolar.yml
shell
cat /usr/local/etc/cpolar/cpolar.yml
Bash

3.1.4.3 保留固定TCP公网地址
使用cpolar为其配置TCP地址,该地址为固定地址,不会随机变化,方便后续ssh远程登录。
进入官网的预留页面:https://dashboard.cpolar.com/reserved

列表中显示了一条已保留的TCP地址记录:
-
地区:显示为
China Top
。 -
地址:显示为
16.tcp.cpolar.top:14290
。注:地址每个账号的都不同,请以自己保留生成的为主
3.1.4.4 启用ssh隧道,配置固定tcp地址
点击左侧菜单栏的隧道管理
,展开进入隧道列表
页面,页面下默认会有 2 个隧道:
- ssh隧道,指向22端口,tcp协议
- website隧道,指向8080端口,http协议(http协议默认会生成2个公网地址,一个是http,另一个https,免去配置ssl证书的繁琐步骤)

接着点击ssh隧道的编辑按钮,进入编辑页面,修改成固定tcp地址,如图所示:

3.1.4.5 使用固定的tcp地址进行远程ssh登录
ssh远程工具可以使用MobaXterm
、Xshell
或者FinalShell
都可以,这里采用FinalShell
进行远程登录演示

接下来,双击创建的ssh连接,如出现提示,点击接受并保存
即可,即可连接到内网服务器

3.2 安装JDK
本文采用jdk17作为演示
shell
#下载jdk17软件包
wget https://download.oracle.com/java/17/archive/jdk-17_linux-x64_bin.rpm
#安装jdk17
sudo rpm -ivh jdk-17_linux-x64_bin.rpm
Bash

安装完成后,查看版本,确认安装
shell
java -version
Bash

3.3 上传打包好的Jar文件至服务器
该项目为简单模拟测试调试使用项目,共写3个简单接口:
- 🟢正常接口:
/api/normal/info
:获取应用程序的基本信息,包括名称、版本、作者等 - 🔴异常接口:
/api/bug/null-pointer
:故意抛出NullPointerException,用于调试异常处理 - 🟡阻塞接口:
/api/bug/infinite-loop
:进入无限循环,模拟线程阻塞场景
3.3.1 打包springboot项目
idea中侧边栏选择Maven选项,然后如图操作进行构建打包jar文件:
3.3.2 上传至服务器
依次步骤打开找到jar文件springboot-debug-test-1.0.0.jar

将jar文件直接拖动至finalshell
空白处即可上传
注意:一定要使用 root 用户登录,否则上传可能失败(或者确保当前用户对目标目录具有写权限)。
如果使用普通用户登录 FinalShell,可通过
chmod
或chown
命令赋予目标目录写权限。

4. 启动 JAR 文件并配置远程调试
4.1 启动 JAR 文件
使用 java -jar
命令启动你需要调试的 JAR 文件,并开启远程调试。需要在启动命令中指定 JVM 调试参数:
shell
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 springboot-debug-test-1.0.0.jar
Bash
5005
为远程调试的端口号。
springboot-debug-test-1.0.0.jar
是要调试的 JAR 文件名称。

项目已经成功启动,端口5005被监听,后台该jar文件项目在端口8080(http)上运行。
4.2 cpolar隧道配置
4.2.1 http(8080端口)穿透
访问cpolar web ui管理界面(忘记可看前面3.1.4.2小节),进入到隧道列表,名称为website
的隧道,点击编辑,可以看到如下信息:
- 隧道名称:website
- 协议:http
- 本地地址:8080
这些信息正是后台项目8080端口所需要的,所以不需要进行修改,默认创建好的隧道直接可以使用。

接着左侧菜单栏选择【状态】>【在线隧道列表】,可以看到website隧道有两个公网地址,http协议(http协议默认会生成2个公网地址,一个是http,另一个https,免去配置ssl证书的繁琐步骤)

直接选择一个至浏览器测试,这里选择http(注:每个用户的公网地址都不相同)
由于后台项目提到的接口地址后缀为/api/normal/info
,所以正确拼接地址应为:
shell
<您的公网地址>/api/normal/info #如:http://5c19bf20.r1.cpolar.top/api/normal/info
Bash

接口正常返回了api接口信息,穿透成功!
4.2.2 调试端口(5005端口)穿透
4.2.2.1 保留固定tcp地址
选择将5005端口穿透设置为固定的tcp地址是为了方便后续多次调试,tcp地址不会进行变化,也可以不进行此步骤操作。
进入官网的预留页面:https://dashboard.cpolar.com/reserved
- 地区当前选择的是:
China Top
- 地址信息为:
3.tcp.cpolar.top:12718
记住新创建的地址信息(注意:每个用户创建的地址信息都有所不同,请注意个人的地址信息
)

4.2.2.2 创建新隧道
进入创建隧道列表,填写好对应信息,如下图:
- 协议:
tcp
- 本地地址为:
5005
- 端口类型:
固定tcp端口
- 预留tcp地址:
填写您预留固定的tcp地址

5.IDEA远程Debug调试内网项目
5.1 idea配置remote jvm debug
点击启动按钮左边的选项卡,然后在选项卡中点击Edit Configurations
进入Run/Debug Configurations
页面

依次点击左上角【+】号按钮,下滑选择【Remote JVM Debug】选项,点击进入。

填写主机以及端口信息,具体参考如下图:
- Name:
自定义名字(如:Remote Debug)
- Host:
填写固定的tcp地址去除端口部分(如:3.tcp.cpolar.top)
- Port:
填写固定的tcp地址端口部分(如:12718)

5.2 启动及调试
点击右上角的小虫子图标即可启动调试,启动调试后,控制台会出现类似Connected to the target VM, address: '3.tcp.cpolar.top:12718', transport: 'socket'
的信息,即代表启动成功

来到BugController
控制器,里面有一个异常接口api/bug/null-pointer
,代码如下:
java
/**
* 空指针异常接口
*
* 该接口会故意抛出NullPointerException
* 用于测试空指针异常的调试场景
*
* @return 永远不会执行到这里,因为会抛出异常
*/
@GetMapping("/null-pointer")
public String nullPointerException() {
//1.此位置故意设置nullString字符串为null
String nullString = null;
String now = LocalDateTime.now().format(FORMATTER);
System.out.println("空指针异常接口被调用,准备抛出异常,时间:" + now);
//2.待接口返回时执行nullString的toString方法时就会抛出NullPointerException异常
return nullString.toString();
}
Java
切换到浏览器,然后请求8080端口的穿透地址
+异常接口地址
进行请求,如:
shell
<您的8080端口穿透地址>/api/bug/null-pointer #如:http://5c19bf20.r1.cpolar.top/api/bug/null-pointer
Bash

接着在String nullString = null;
代码段左边打上断点调试,如下图:

再次请求一次该链接http://5c19bf20.r1.cpolar.top/api/bug/null-pointer
进行发送http请求,可以看到后端idea中已经进去断点调试了

进入下一步骤,查看到nullString
变量值确实为null

多跳几个步骤,进入源码后可以确认已抛出空指针异常,提示 nullString 为 null,无法调用其方法。
在finalShell终端1界面中也可以看到,控制台输出的日志出现了NullPointerException
异常

通过以上的配置,这样您就可以在家中或者外出无法及时回到公司时,也能很轻松的调试公司中内网服务器里部署的测试环境项目啦!
6.可能出现的问题
6.1 访问页面出现404的情况是怎么回事?
访问出现404:
可以发现,接口路径中少了全局上下文路径/api ,补上就可以访问啦!

7.总结
软件开发的本质,是在复杂系统中寻找确定性。RemoteJVMDebug提供了洞察程序运行的"X光眼",cpolar则拆除了网络环境的"隔离墙"。当我们能够不受物理位置限制调试任何环境的服务,当紧急问题可以在第一时间得到专业排查------技术在这一刻展现了最朴素的价值:它让开发者更专注创造,让问题解决更高效,最终让软件产品更可靠。在分布式系统日益复杂的今天,这种"调试自由"或许正是提升研发效能的关键所在。
项目源码
本文中使用的示例项目已开源,欢迎访问GitHub仓库获取完整代码:
👉 https://github.com/TanChengBin/springboot-debug-test
如果您觉得这个项目对您有帮助,欢迎给项目点个Star⭐️支持!
404的情况是怎么回事?
访问出现404:
外链图片转存中...(img-8prQbFFN-1758587215131)
可以发现,接口路径中少了全局上下文路径/api ,补上就可以访问啦!
外链图片转存中...(img-w9jKaOVm-1758587215131)
7.总结
软件开发的本质,是在复杂系统中寻找确定性。RemoteJVMDebug提供了洞察程序运行的"X光眼",cpolar则拆除了网络环境的"隔离墙"。当我们能够不受物理位置限制调试任何环境的服务,当紧急问题可以在第一时间得到专业排查------技术在这一刻展现了最朴素的价值:它让开发者更专注创造,让问题解决更高效,最终让软件产品更可靠。在分布式系统日益复杂的今天,这种"调试自由"或许正是提升研发效能的关键所在。
项目源码
本文中使用的示例项目已开源,欢迎访问GitHub仓库获取完整代码:
👉 https://github.com/TanChengBin/springboot-debug-test
如果您觉得这个项目对您有帮助,欢迎给项目点个Star⭐️支持!
以上就是如何在本地使用Remote JVM Debug 进行内网服务器调试,并安装cpolar内网穿透工具配置固定不变的TCP公网地址,实现随时随地远程访问的全过程,感谢您的观看,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站