前言

开发新功能时,经常会遇到在本地环境运行没问题,但是部署到了 Linux 服务器上跑的时候就出现问题这种情况;还有一种情况是需要定位线上问题,这两种情况以前的做法就是加 log 日志输出,总是不能精准定位问题所在,如果能够像本地环境一样调试代码,那这个问题也就迎刃而解了。

开始之前

本文介绍 IDEA 与 Tomcat 的远程调试,且笔者在日常工作当中也是这么做的,网上很多都是互相抄袭,没有经过验证的伪原创,让人不快。

一、添加运行项

IDEA 添加远程调试项

填写服务器 IP ,端口使用默认的即可,复制第二行参数

二、修改服务器中的 Tomcat 配置

连接远程服务器,进入 Tomcat 根目录下的 bin 目录,修改 catalina.sh 文件

定位到 108 行左右,找到 cygwin=false 这一行,

在这一行的前一行添加

JAVA_OPTS=""

然后将从 IDEA 中复制的那串参数粘贴到双引号之间,保存退出。

然后启动 Tomcat,如果 Tomcat 是已经启动的话,必须要重启一下。

三、调试环境修改

为了调试方便,需要暂时关闭掉防火墙,否则可能无法连接。

1
service iptables stop

四、IDEA 远程调试

回到 IDEA,点击 Debug 按钮,启动刚才添加的 Remote,如果以上没有配置错,那么控制台将打印出

此时就和本地调试一样打断点调试就行了

五、解决IDEA 无法连接远程 Tomcat

如果提示无法连接,如下图

则检查以上配置是否正确,确认都正确的话,可能是服务器防火墙的原因导致,需要关闭防火墙。

如果服务器是阿里云的,还需要配置 ECS 服务器的安全组,开放 5005 远程调试端口。 详见第八条

六、解决断点不生效

注意:

启动 Remote 的 Debug 之后,需要等待断点变成如下图时,再去访问接口;如果断点中间没有出现对号,说明断点还未生效,需要等待一会儿。

如果有时候死活也没法断点,就把服务器上的 Tomcat 重启一下试试!

七、其他问题

因为在 catalina.sh 中添加了远程调试的参数,导致使用 tomcat 的 bin/shutdown.sh 时,可能无法完全停止服务器。可以直接 kill 掉服务器,如果不再进行远程调试,最后把远程调试参数注释掉重启。

八、阿里云 ECS 安全组设置

进入 ECS 控制台,点击安全组

然后选择 创建安全组

然后配置该安全组的规则

点击公网入标签,再点击右上角 添加安全组规则

授权对象 填写你的 ip 地址即可。

添加完安全组之后,进入 ECS 实例

选择右侧 加入安全组,选择加入刚才添加的安全组即可。