JPDA简介
JPDA(JavaTM Platform Debugger Architecture ),是为Java平台上的调试器定义了一个标准的体系结构,使您能够在各种环境中轻松调试 Java 应用程序,该体系结构包括3个主要组成部分:JVM TI、JDI和JDWP。
JDWP是什么?
JDWP的全称是Java Debug Wire Protocol,它定义了JPDA front-end和JPDA back-end之间通讯信息的二进制格式。这里的通讯信息主要包括两种:调试器发送给JVM的请求信息和JVM发送给调试器的调试信息。
总结一下,调试器 调用JDK提供的JDI实现 (JPDA front-end),经由JDWP协议 ,和JVM自带的JPDA back-end (jdwp.dll, jdwp.so, ...)进行通讯。JPDA back-end 通过调用JVM TI接口 ,从而获知调试信息,或发送控制命令。然后,JPDA back-end 将调试信息或命令执行结果,通过JDWP协议 ,返回给调试器 。
如何启用JPDA
默认情况下,JVM并没有启用JPDA back-end。需要在启动JVM的命令行加载以下参数:
-Xdebug -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y
-Xdebug
启用调试特性
-Xrunjdwp
启用JDWP实现,它包含若干子选项:
transport=dt_socket
JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
address=8000
JVM在8000端口上监听请求。
server=y
y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
suspend=y
y表示启动的JVM会暂停等待,直到调试器连接上。
suspend=y这个选项很重要。如果你想从Tomcat启动的一开始就进行调试,那么就必须设置suspend=y。
一、远程调试Tomcat参数设置
修改
Tomcat/bin/startup.bat
文件,在最前面加上如下代码
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
注意上面命令
必须写成一行中间不能有换行,
-
前是空格
-
后是非空格,由于显示器分辨率不同,该文章在显示的时候可能会有换行的情况。
|
在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件的最后添加需要debug的进程 #远程调试NameNode export HADOOP_NAMENODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y" #远程调试DataNode export HADOOP_DATANODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=8889,server=y,suspend=y" #远程调试ResourceManager export YARN_RESOURCEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=8890,server=y,suspend=y" #远程调试NodeManager export YARN_NODEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=8899,server=y,suspend=y |
1、在Eclipse中导入Hadoop的源码,找到NameNode的main方法,打一个断点
2、右键Debug AS进入配置界面,并点击Debug
三、在远程主机的$HADOOP_HOME/etc/hadoop/hadoop-env.sh中添加
export HADOOP_NAMENODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y"
四、启动NameNode
五、进入调试模式