断点不生效主因是source路径错误或代码版本不一致;连接失败多因端口不通或jpda未启动。tomcat 7+必须用catalina_opts而非jpda_address,需在catalina.sh开头添加单行declare -x catalina_opts="-xdebug -xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000",并执行./catalina.sh jpda start,同时检查防火墙、selinux及云安全组配置。

能连上,但断点不生效,基本是 source 路径没对或代码版本不一致;连接失败,八成是端口不通或 JPDA 没真正启动。
Linux Tomcat 启动参数必须加 CATALINA_OPTS,不是改 JPDA_ADDRESS
很多教程还在教改 catalina.sh 里的 JPDA_ADDRESS="8000",这已经过时了。Tomcat 7+ 默认不读这个变量,只认 CATALINA_OPTS。直接在 catalina.sh 文件开头(第一行或第二行)插入:
declare -x CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
注意几点:
-
address=8000是监听地址,默认绑定0.0.0.0:8000;如果只允许本地调试,写成address=localhost:8000,但远程调试必须放开 -
suspend=n表示 Tomcat 启动后立刻运行,而不是卡在启动阶段等调试器连入;设为y会阻塞,除非你真要调试ServletContextListener初始化逻辑 - 不要把参数拆成多行,
CATALINA_OPTS必须是单行字符串,否则 JVM 解析失败 - 确认
catalina.sh有执行权限:chmod +x catalina.sh
启动命令必须用 ./catalina.sh jpda start,不能只跑 startup.sh
startup.sh 本质是调用 catalina.sh start,它不会加载 jpda 模式。只有显式执行 jpda 子命令,JVM 才会注入调试代理。
正确做法:
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
- 进到
$CATALINA_HOME/bin目录下 - 执行:
./catalina.sh jpda start(后台启动)或./catalina.sh jpda run(前台输出日志,方便确认是否监听成功) - 检查
catalina.out是否出现:Listening for transport dt_socket at address: 8000 - 如果没这行,说明
CATALINA_OPTS没生效,或端口被占用(用netstat -tuln | grep :8000查)
MyEclipse 里 Remote Java Application 的 Source 必须手动指定,不能依赖自动推导
MyEclipse 不会自动识别你本地项目和远程 class 的对应关系。即使项目名、包结构一样,只要 .class 和 .java 时间戳或编译路径不匹配,断点就灰掉。
配置步骤:
- Debug Configurations → Remote Java Application → 新建配置
-
Host填服务器 IP(不是localhost),Port填你设的address端口(如8000) - 切到
Source标签页 → 点Add…→ 选Java Project→ 勾选你正在调试的项目 - 如果项目是 Maven 结构,且 class 在
target/classes,还要额外加File System Directory,指向该路径(否则 MyEclipse 找不到已编译字节码) - 务必确认:你本地打开的源码,和服务器上
WEB-INF/classes或WEB-INF/lib/*.jar里的 class 是同一构建产物(Git commit、打包时间、编译 JDK 版本都要一致)
防火墙和 SELinux 往往比配置错误更难排查
常见现象:MyEclipse 显示 “Failed to connect to remote VM”,但 catalina.out 里确实有监听日志。
这时优先检查:
- 服务器防火墙是否放行调试端口:
sudo iptables -L | grep 8000或sudo ufw status - SELinux 是否拦截 socket 绑定:
sudo setenforce 0临时关闭测试;若恢复后仍需启用,得加策略:sudo semanage port -a -t http_port_t -p tcp 8000 - 云服务器安全组(如阿里云、AWS)是否开放该端口入方向规则
- Tomcat 进程是否真的在监听
0.0.0.0:8000而非127.0.0.1:8000:用ss -tuln | grep :8000看0.0.0.0还是127.0.0.1
最易忽略的是:本地 MyEclipse 的 Debug 配置里填了 localhost 当 Host,而你以为自己在连远程——其实连的是自己机器上根本没开调试端口的本地 Tomcat。










