cpolar赋能RemoteJVMDebug打造全场的景调试体验

文章目录

    • 前言
    • [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开源,您可以直接获取完整代码进行学习和实践:

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系统服务

官网地址:https://www.cpolar.com

进入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远程工具可以使用MobaXtermXshell或者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,可通过 chmodchown 命令赋予目标目录写权限。

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 | 远程访问 | 搭建网站

相关推荐
艾莉丝努力练剑9 小时前
【测试开发/测试】详解测试用例(上):测试用例、万能公式
运维·经验分享·测试开发·测试
会飞的小蛮猪11 小时前
Jenkins运维之路(初次调试共享库)
运维·经验分享·docker·容器·jenkins
卷Java11 小时前
百度智能云车牌识别API官方配置指南
java·开发语言·经验分享·vscode·学习·微信小程序·intellij idea
程思扬9 天前
利用JSONCrack与cpolar提升数据可视化及跨团队协作效率
网络·人工智能·经验分享·docker·信息可视化·容器·架构
月阳羊9 天前
【硬件-笔试面试题-95】硬件/电子工程师,笔试面试题(知识点:RC电路中的时间常数)
java·经验分享·单片机·嵌入式硬件·面试
智者知已应修善业10 天前
【矩阵找最大小所在位置】2022-11-13
c语言·c++·经验分享·笔记·算法·矩阵
SccTsAxR10 天前
[C语言]常见排序算法①
c语言·开发语言·经验分享·笔记·其他·排序算法
智者知已应修善业10 天前
【51单片机单按键控制2个LED循环闪烁】2022-12-7
c语言·经验分享·笔记·嵌入式硬件·51单片机