看看bin/catalina.sh你会发现这么一段注释 JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start" JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start" command is If used, JPDA_TRANSPORT, JPDA_ADDRESS, and JPDA_SUSPEND are ignored. =$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND 所以你只需要提供JPDA_ADDRESS环境变量参数就行了。 比如这样:JPDA_ADDRESS=5005 bin/catalina.sh jpda start 参考文档 Debug your Java code with ease using JPDA JPDA
开启方法如下: windows 配置:catalina.bat set JPDA_TRANSPORT=dt_socket set JPDA_ADDRESS=8000 set JPDA_SUSPEND=y Linux配置catalina.sh JPDA_TRANSPORT='dt_socket' JPDA_ADDRESS='8000' JPDA_SUSPEND='y' 启动Tomcat的方式: cataina.bat /cataina.sh jpda start
编辑 tomcat/bin/catalina.sh 把 localhost 改 0.0.0.0,否则 tomcat远程调试只能本机访问 if [ "$1" = "jpda" ] ; then if [ -z "$JPDA_TRANSPORT" ]; then JPDA_TRANSPORT="dt_socket" fi if [ -z "$JPDA_ADDRESS" ]; then JPDA_ADDRESS="localhost:8000" fi 重新启动 . /catalina.sh jpda start (助记:java 的 j,pda掌上电脑) ? 启动调试
理解这一点对于学习 JPDA 非常重要。 换句话说,通过JPDA 这套接口,我们就可以开发自己的调试工具。 通过这些 JPDA 提供的接口和协议,调试器开发人员就能根据特定开发者的需求,扩展定制 Java 调试应用程序,开发出吸引开发人员使用的调试工具。 前面我们提到的 IDE 调试工具都是基于 JPDA 体系开发的,区别仅仅在于它们可能提供了不同的图形界面、具有一些不同的自定义功能。 另外,我们要注意的是,JPDA 是一套标准,任何的 JDK 实现都必须完成这个标准,因此,通过 JPDA 开发出来的调试工具先天具有跨平台、不依赖虚拟机实现、JDK 版本无关等移植优点,因此大部分的调试工具都是基于这个体系的 JPDA模块层次 JPDA层次比较 更加深入的介绍文档可以参见 https://developer.ibm.com/zh/articles/j-lo-jpda1/ 2、idea 和eclipse
1 前言 本文将会讲述JPDA的组成,Debugger的实现原理等。 程序异常了! 返回结果不对! 在我这儿正常啊。 说到这些,就不得不提JPDA(Java Platform Debugger Architecture)。我们每次使用的debug功能,都是靠JPDA的支撑实现的。 2 什么是JPDA? 所以,从整体上看,我们可以把JPDA看作一个两个互相通讯的程序,所以我们可以在任意地点很方便的调试另一个JVM上运行的程序。 每次我们打开IDE调试一个Java应用的时候,或者远程attach一个Java进程的时候,别忘了这个IDE背后的男人---JPDA。 另外,Tomcat启动脚本中也直接包含了debug方式启动的功能,在命令行中输入catalina jpda start, Tomcat就以debug方式启动了。
dt_socket,server=y,suspend=n,address=8899" 方法2、 Win系统 在tomcat目录下的bin目录中新建debug.bat,编辑内容如下 set JPDA_ADDRESS startup 双击debug.bat Linux 系统 startup.sh 中的最后一行 exec "$PRGDIR"/"$EXEXUTABLE" start "$@"中的start修改成 jpda start ,默认的调试端口是8000 ,可以在catalina.sh 文件中设置JPDA_APPDESS=8000 使用startup.sh 或者catalina.sh jpda start 启动
/bin/sh cygwin=false darwin=false ... if [ "$1" = "jpda" ] ; then if [ -z "$JPDA_TRANSPORT" ]; then JPDA_TRANSPORT="dt_socket" fi if [ -z "$JPDA_ADDRESS" ]; then JPDA_ADDRESS="localhost:8000 " fi if [ -z "$JPDA_SUSPEND" ]; then JPDA_SUSPEND="n" fi if [ -z "$JPDA_OPTS" ]; then JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND " fi CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS" shift fi ...
JVM 激活远程调试的启动参数有 JPDA_OPTS, CATALINA_OPTS 和 JAVA_OPTS。 1 使用JPDA_OPTS 在 CATALINA_HOME/bin 目录下创建可执行脚本文件 setenv.sh ( Windows 创建 setenv.bat ),加入内容: Linux setenv.sh export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n" Windows setenv.bat /catalina.sh start 3 使用JPDA启动 最后一种启用远程调试的方式是用 JPDA 切换, 用如下的启动命令将使用默认值自动启用远程调试, catalina jpda start 该命令默认使用的设置是 可以通过修改 Tomcat 需要的这些环境变量来实现: //JPDA_TRANSPORT: 指定 jpda 传输协议 //JPDA_ADDRESS: 指定远程调试端口 //JPDA_SUSPEND: 指定
在 Debug 领域,JDK 有一套规范与体系来支持,即 Java Platform Debugger Architecture,JPDA 体系。 在 JPDA 体系中定义了 三个角色, 每个角色又对应着不同的技术模块支撑,分别为 JVMTI/JDWP/JDI。
= if not ""%1"" == ""jpda"" goto noJpda set JPDA=jpda if not "%JPDA_TRANSPORT%" == "" goto If it is, it sets the JPDA variable to jpda, then checks the JPDA_TRANSPORT and JPDA_ADDRESS variables 如果是,则将 JPDA 变量设置为 jpda,然后检查 JPDA_TRANSPORT 和 JPDA_ADDRESS 变量,并移动参数。 if not ""%1"" == ""jpda"" goto noJpda set JPDA=jpda if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport then JPDA_ADDRESS="8000" fi if [ -z "$JPDA_OPTS" ]; then JPDA_OPTS="-Xdebug - Xrunjdwp:transport=$JPDA_TRANSPORT
startup-debug.bat,然后打开startup-debug.bat,找到call "%EXECUTABLE%" start %CMD_LINE_ARGS%这一行,修改为“call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%”,然后在上面添加三行: set JPDA_TRANSPORT=dt_socket set JPDA_ADDRESS=9000 set JPDA_SUSPEND
调优 JDWP 协议 修改startup.sh ## exec "$PRGDIR"/"$EXECUTABLE" start "$@" exec "$PRGDIR"/"$EXECUTABLE" jpda JPDA_ADDRESS="8000" idea设置 创建配置。
Packet 的结构 JDWP 传输接口(Java Debug Wire Protocol Transport Interface) JDWP 的命令实现机制 JDWP 的事件处理机制 JPDA (Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。 JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI) 其中常用的开发平台Eclipse中自带了JDWP兼容的调试器
=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=debian" export JPDA_OPTS Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xdebug" 然后,启动tomcat: bin/catalina.sh jpda 最后,before launch的选项卡下,build artifact时选 war,不要选war exploded 3.之前的catalina.sh中配置的 export JPDA_OPTS= 这一行
Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window
debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window
Junit自动化 Java程序监控: 常用监控工具, 性能问题 Java典型问题:锁问题, 线程池问题,JVM内存基础介绍, JVM内存问题分析与定位, TLS问题, Crash问题 JVM调试体系 简介 JPDA 大部分调试工具都是基于JPDA提供的上层接口,扩展定制而来的。 JVM TI基本原理 JVM TI 是JVM提供的native 编程接口,可以用来获取JVM内部状态,以及控制Java程序的执行。
Java平台调试体系架构(JPDA)和JDWP(Java Debug Wire Protocol):参考权威文档 JPDA 体系概览 以及 JDWP 远程命令执行漏洞 JDWP协议是个标准协议,我们的 找到入口文件startup.sh,最后一句改为的start前面加上 jpda如下: exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@" 或者在catalina.sh 中进行配置: JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005’ 这样根据上面的脚本可知,判断第一个参数等于 jpda,所以调试端口开放了。
/bin/sh cygwin=false darwin=false ... if [ "$1" = "jpda" ] ; then if [ -z "$JPDA_TRANSPORT" ]; then JPDA_TRANSPORT="dt_socket" fi if [ -z "$JPDA_ADDRESS" ]; then JPDA_ADDRESS="localhost:8000 " fi if [ -z "$JPDA_SUSPEND" ]; then JPDA_SUSPEND="n" fi if [ -z "$JPDA_OPTS" ]; then JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND " fi CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS" shift fi ...
作者:付政委 背景描述 JVMTI(JVM Tool Interface)位于jpda最底层,是Java虚拟机所提供的native编程接口。 JPDA 定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,或者说定义了它们通信的接口。 虚拟机工具接口(JVMTI) JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它处于整个 JPDA 在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令 org.itstack.demo.jvmti.TestLocationException.main(TestLocationException.java:10) 其他内容: 1、jvmti api 2、JPDA