sJPDA 的全称是 Java Platform Debugger Architecture,它是 Java 官方针对 Java 代码调试所设计的一个机制,具体介绍可参照 链接
Java Application 的设置方式
- 创建调试用的Main方法,相关代码如下:(实际上代码随意)
-
import java.util.concurrent.TimeUnit; public class JPDAMain { public static void main(String[] args) throws InterruptedException { long startTime = System.currentTimeMillis(); System.out.println("start time:" + startTime); TimeUnit.SECONDS.sleep(3); long endTime = System.currentTimeMillis(); System.out.println("cost time:" + (endTime - startTime)); } }
- 在Eclipse上导出Runnable Jar,方式如下
-
- 唯一注意的地方是Launch Configuration务必选中第一步中创建的类,导出的路径任意假设为${PATH}
- 执行第二步所创建的jar包,命令如下:
-
java -jar -Xdebug -Xrunjdwp:transport=dt_socket,address=8899,server=y,suspend=y jpda-test.jar
- 其中注意address=8899 指定jpda所监听的端口(后面调试用到,如果是远程运行还要开放端口)
- suspend=y 的意思是一直挂起本程序并等待远程调试的连接,设成suspend=n表示不挂成,这里需要设置为y,否则java 程序运行后,你无法连接上;成功运行后控制台出现如下提示:
-
java -jar -Xdebug -Xrunjdwp:transport=dt_socket,address=8899,server=y,suspend=y jpda-test.jar Listening for transport dt_socket at address: 8899
- 接着增加debug 断点,然后打开eclipse debug Configurations ,最后点debug按钮
- 最终就可以远程调试运行在远端的Java Application。
Java Web Application设置方式
创建调试的类,这里使用web3.1新建一个Web Servlet,相关代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/jpdaDemo")
public class JPDAServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println("<h1>jpda Success debug</h1>");
writer.println("</body>");
writer.println("</html>");
}
}
把程序打包成war的形式并部署到tomcat,接着修改tomcat启动参数(注意suspend=n)
WIN系统,在catalina.bat:
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8899
*inux系统,在catalina.sh
CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8899"
jpda 参数说明
虚拟机参数设置
1.1启用调试服务
-Xdebug 启用调试
-Xrunjdwp:<sub-options> 加载JVM的JPDA参考实现库
1.2 Xrunjdwp子参数(sub-options)配置
Xrunjdwp子参数的配置格式如下
Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
1.3 transport=dt_socket
JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
1.4 address=8899
JVM在8899端口上监听请求。
1.5 server=y
y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
1.6 suspend=y
y表示启动的JVM会暂停等待,直到调试器连接上。
suspend=y这个选项很重要。如果你想从Tomcat启动的一开始就进行调试,那么就必须设置suspend=y
通过${tomcat_home}/bin/startup.sh或catalina.sh start启动 ,同样控制台会出现
至此配置完成,然后在你想要的地方增加断点并在浏览器上触发该Servlet。