JAVA 调试, JPDA, Java Debug
JAVA 调试, JPDA, Java Debug JPDA 三层:JDI(调试器 Java API)→ JDWP(线协议)→ JVMTI(JVM native)。JVMTI 专文见 JVMTI。开发期改已加载类(HotSwap)走本体系,与 BTrace attach 观测不是同一路;热替换总览见 开发期热替换。 远程调试 远程调试分为主动连接调试,和被动连接调试。这里以Eclipse为例。 主动连接调试:服务端配置监控端口,本地IDE连接远程监听端口进行调试,一般调试问题用这种方式。 被动连接调试:本地IDE监听某端口,等待远程连接本地端口。一般用于远程服务启动不了,启动时连接到本地调试分析。 主动连接调试 首先需要远程服务配置启动脚本: JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005" 如果是启动jar包,指令: java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -jar test.jar JAVA 自身支持调试功能,并提供了一个简单的调试工具 - JDB, 类似于功能强大的 GDB,JDB 也是一个字符界面的调试环境,并支持设置断点,支持线程线级的调试。 JAVA的调试方法如下: 首先设置JVM,并设置参数,使之工作在 DEBUG 模式下,加入参数: -Xdebug -Xrunjdwp,transport=dt_socket,server=y,address=5432,suspend=n,onthrow=java.io.IOException,launch=/sbin/echo -Xdebug: 通知 JVM 工作在 DEBUG 模式下 -Xrunjdwp 是通知 JVM 使用 (java debug wire protocol) 来运行调试环境。该参数提供了一系列的调试选项: transport 指定调试数据的传送方式,dt_socket 是指用 SOCKET 模式,另有 dt_shmem 指用共享内存方式,其中,dt_shmem 只适用于 Windows 平台。 server 参数是指是否支持在 server 模式的 JVM 中. onthrow 当产生该类型的 Exception 时,JVM 就会中断下来,进行调式。(可选参数) launch 当JVM被中断下来时,执行的可执行程序。(可选参数) suspend: y/n 指明,是否在调试客户端建立起来后,再执行JVM。 onuncaught (=y或n) 指明出现 uncaught exception 后, 是否中断JVM的执行. address 端口 启动调试工具。 最简单的调试工具就是上面提到的JDB,以上述调试用JVM为例,可以用下面的命运行启动JDB: ...