如何调试Tomcat Catalina引擎?
我完全懂你这种抓心挠肝的感觉——明明想钻进Tomcat核心代码揪出奇怪问题的根源,结果断点要么直接“滑过去”,要么跳到Spring代码就再也进不了Catalina的逻辑,太闹心了!结合我帮开发者排查这类问题的经验,你遇到的情况大概率不是Tomcat编译的问题,而是IDE配置或者调试参数的细节没到位,给你一步步捋清楚:
先把IntelliJ的源码关联给掰正
很多时候我们以为自己关联了本地编译的Tomcat源码,但IntelliJ可能偷偷用了Maven仓库里下载的、不带完整调试信息的源码包。你打开Run/Debug Configurations,找到你的Tomcat实例,切换到Source标签页,把本地Tomcat源码里的catalina模块目录(比如你的tomcat源码根目录/java/org/apache/catalina)手动加进去,同时把原来可能存在的、来自依赖库的Tomcat源码给移除掉。加完后可以在IntelliJ里打开ApplicationDispatcher类,看顶部的文件路径是不是指向你本地编译的源码,不是的话就重新关联。确认Tomcat编译时的调试信息拉满了
你说已经编译了带debug的Tomcat,但要确认编译参数真的给足了:- 如果是用Ant构建的旧版Tomcat,直接跑
ant debug命令编译,它会自动带上完整的调试参数; - 如果是Maven构建的新版Tomcat(9.x及以后),编译时要加上这两个参数:
mvn clean install -Dmaven.compiler.debug=true -Dmaven.compiler.debuglevel=lines,vars,source。
这里的关键是debuglevel,必须设成lines,vars,source,这样编译出来的class文件才会包含行号、变量名和源码映射的完整信息,不然IDE就算拿到源码也没法精准对应断点位置。
- 如果是用Ant构建的旧版Tomcat,直接跑
检查IDE的调试跳过设置
IntelliJ有个默认设置,会把它认为的“非用户代码”给跳过调试,Tomcat的核心类很可能被归到这一类里了。你打开Settings(Windows是File→Settings,Mac是IntelliJ IDEA→Settings),找到Build, Execution, Deployment→Debugger→Stepping,先把Skip synthetic methods的勾选去掉,再检查Do not step into classes列表里有没有org.apache.catalina开头的条目,有的话直接删掉,这样调试时就能正常步进Tomcat的核心代码了。启动参数的小细节
如果你是用远程attach的方式调试Tomcat(不是让IntelliJ直接启动Tomcat),要确保Tomcat启动时加对了JVM调试参数:- Java 8及更早版本:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 - Java 9及以后版本:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
而且要保证IntelliJ的远程调试配置里的端口和这个完全一致,没有被防火墙或者其他进程占用。
- Java 8及更早版本:
按照这几步调完,再去试ApplicationDispatcher的forward方法断点,应该就能正常步进Tomcat的核心代码了!
内容来源于stack exchange

