java远程调试

远程调试

调试参数说明

-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
参数 说明
-Xdebug 启用调试模式
-Xrunjdwp 加载JVM的JPDA参考实现库
transport=dt_socket Socket链接,可选dt_shmem 经过共享内存的方式链接到调试服务器
address=5005 调试服务器监听的端口
server=y 是不是服务器端,n为客户端
suspend=n 是否暂停程序,等待调试器链接

若调试启用成功,启动程序时控制台会输出:java

Listening for transport dt_socket at address: 5005

服务端设置方法

Java

java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n -jar xxxx.jar

或者node

java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n xxxx

Hadoop jar

  1. 编辑 ${HADOOP_HOME}/bin/hadoop,找到以下行(在文件末尾)
exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
  1. 改成
exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"

MapReduce Job

  1. 编辑${HADOOP_HOME}/etc/hadoop/mapred-site.xml,增长
<property>  
  <name>mapred.child.java.opts</name>  
  <value>-agentlib:jdwp=transport=dt_socket,address=8883,server=y,suspend=y</value>  
</property>
<property>  
    <name>mapred.tasktracker.map.tasks.maximum</name>  
    <value>1</value>  
</property>  
<property>  
    <name>mapred.reduce.child.java.opts</name>  
    <value>-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8884</value>  
</property>  
<property>  
    <name>mapred.tasktracker.reduce.tasks.maximum</name>  
    <value>1</value>  
</property>

Hadoop源码

  1. 编辑 ${HADOOP_HOME}/bin/hadoop/etc/hadoop/hadoop-env.sh,找到以下行:
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
  1. 根据实际要调试的组件更改相应的行,假设要调试namenode,则修改export HADOOP_NAMENODE_OPTS这行,效果以下:
export HADOOP_NAMENODE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"

HBase源码

  1. 编辑 ${HBASE_HOME}/bin/hbase,根据要调试的组件,修改以下位置
elif [ "$COMMAND" = "master" ] ; then
  CLASS='org.apache.hadoop.hbase.master.HMaster'
  if [ "$1" != "stop" ] ; then
    HBASE_OPTS="$HBASE_OPTS $HBASE_MASTER_OPTS"  #若要调试HMaster请修改此行
    #HBASE_OPTS="$HBASE_OPTS $HBASE_MASTER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"
  fi
elif [ "$COMMAND" = "regionserver" ] ; then
  CLASS='org.apache.hadoop.hbase.regionserver.HRegionServer'
  if [ "$1" != "stop" ] ; then
    HBASE_OPTS="$HBASE_OPTS $HBASE_REGIONSERVER_OPTS" #若要调试RegionServer请修改此行
    #HBASE_OPTS="$HBASE_OPTS $HBASE_REGIONSERVER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"
  fi

Tomcat WebApp

  1. 编辑 ${TOMCAT_HOME}/bin/catalina.sh,首行添加
CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

客户端设置方法

Intelij IDEA

  1. 服务端设置调试参数并启动程序
  2. 菜单选择: Run -> Edit Configuration
  3. 点击左侧视图上方的加号,选择Remote,如图
  4. 设置调试名称(这里设为remote),配置服务器IP和端口(端口要和远程端配置的端口保持一致),如图<br>
  5. 点击OK
  6. 菜单选择:Run -> Debug
  7. 选择设置好的调试名称:remote,如图<br>
  8. 接下来跟调试本地程序同样

Eclipse

  1. 服务端设置调试参数并启动程序
  2. 菜单选择: Run -> Debug Configuration
  3. 左侧视图中,双击Remote Java Application建立一个远程调试(如图)<br>
  4. 选择要调试的Project
  5. 配置服务器IP和端口(端口要和远程端配置的端口保持一致)
  6. 点击Debug开始调试
  7. 接下来跟调试本地程序同样
相关文章
相关标签/搜索