使用jdb调试Java Servlet:jdb附加Tomcat10及编译调试参数相关问题
解答
前置准备:开启Tomcat调试模式
要让jdb能附加到Tomcat进程,首先需要开启Tomcat的JPDA远程调试支持,操作步骤如下:
- 进入Tomcat的bin目录:
cd /opt/tomcat/apache-tomcat-10.0.10/bin - 如果Tomcat已经启动,先关闭现有进程:
./shutdown.sh - 以JPDA调试模式启动Tomcat:
./catalina.sh jpda start
默认调试端口为8000,如需修改端口可以在启动前执行export JPDA_ADDRESS=0.0.0.0:自定义端口再执行启动命令。
1. jdb附加到Tomcat并调试指定Servlet
- 执行附加命令连接Tomcat调试端口:
jdb -attach 127.0.0.1:8000
连接成功后会进入jdb交互终端。 - 给目标Servlet设置断点:
你需要提前知道目标Servlet的全限定类名和要调试的方法/行号,举例:- 方法断点:如果要在
com.example.TestServlet的doGet方法入口断住,执行:stop in com.example.TestServlet.doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) - 行号断点:如果要在类的第30行断住,执行:
stop at com.example.TestServlet:30
- 方法断点:如果要在
- 触发Servlet执行:在浏览器或者用curl访问该Servlet对应的访问路径,jdb会自动停在你设置的断点位置,之后就可以用
next(步过)、step(步入)、print 变量名(查看变量值)等常规jdb命令调试。
2. javac编译带调试符号的参数
和gcc的-g参数对应,javac添加调试符号的参数就是-g,该参数会生成包含行号、局部变量等完整调试信息的class文件。
手动编译Servlet的示例命令如下,注意要把Tomcat自带的servlet-api.jar加入classpath避免编译报错:javac -g -cp /opt/tomcat/apache-tomcat-10.0.10/lib/servlet-api.jar 你的Servlet类名.java
如果使用构建工具:
- Maven:在maven-compiler-plugin配置中设置
<debug>true</debug>即可自动启用-g参数 - Gradle:在compileJava任务中设置
options.debug = true即可
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

