Java Remote Debug(远程调试)

作者: ytfei 日期: 2011 年 05 月 08 日 发表评论 (0) 查看评论

新接手的项目采用的是Maven作为编译管理工具,项目内容则是按子模块Module来划分。由于模块太多,且都比较大(基本上都能独立运行并负责处理一方面的业务),并采用Socket来进行模块之间的数据通信,结果就导致一个略显臃肿的系统产生了。最重要的是,不知道maven的pom.xml文件出了什么问题,Eclipse也一直无法成功加载部分重要模块(以致最后切换到JetBrain IDEA(Open Source)——这也算是一点收获),常用的调试方式也行不通了。过了好一段时间我才习惯,每次提交代码前都要小心翼翼地检查一遍。

昨天让同事帮我做CodeReview,讨论问题中,看着他演示一下Remote Debug。觉得很神奇,回来试了一下,又加了点资料,才发觉得我真的是Out了。以下内容是个简单的笔记,关于在JetBrain IDEA中使用Remote Debug的方式。

要想Debug,首先得需要在编译时打开debug选项,这样生成的class文件才能支持debug过程。其次,RemoteDebug过程是在两个不同的VM实例间进行了,这就得需要一个通信方式了。常用的是Socket了!因此设置中会涉及到一些端口设置的。

在启动程序时,将以下参数选项添加到自定义的命令行中,程序就会以支持RemoteDeubg的方式启动。

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345

例如:

JVM_OPTS="-server -Xss128k -XX:+UseParNewGC -XX:+HandlePromotionFailure -XX:+HeapDumpOnOutOfMemoryError"
DEBUG="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345"
JVM_OPTS="$JVM_OPTS $DEBUG"
$JAVA_HOME/bin/java $JVM_OPTS -cp $CP com.romebuild.Main

准备程序之后,再配置一下IDE,让它去访问远程的VM了。过程相当简单!

【Run】|【Edit Configuration】,选择【Add New Configuration】|【Remote】,便生成了一个RemoteDebug配置,其中的参数不用修改,但需要设置目标VM实例所在的主机与监听的端口。本例则为localhost:2345了。再选择与目标实例对应的模块代码就可以了。

点击调试按钮,IDEA就会连接到目标VM上去了,调试方法就不用多说了吧。下面来说明一下DEBUG选项参数的意思:

-XDebug 启用调试
-Xrunjdwp 加载JDWP的JPDA参考执行实例。
transport  用于在调试程序和 VM 使用的进程之间通讯。
dt_socket 套接字传输。
server=y/n VM是否需要作为调试服务器执行。
address=2345调试服务器监听的端口号。
suspend=y/n 是否在调试客户端建立连接之后启动 VM 。

关于suspend多说一句,如果设置为y,它会阻塞程序运行,直到有客户端连接到对应的监听端口(这里是9527),程序才真正开始执行。我们有时候会抱怨程序一闪而过,还没来得及在本地加载上代码程序就执行完了,这种情况就可以使用suspend参数。

还有一个细节是-jar参数不能写到-Xug参数前,像这样无法启用调试:
java -jar lib/Main.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y

Java Remote Debug(远程调试)相关推荐

  1. java如何开启远程调试服务端口_Java远程调试

    远程项目报错,但是通过日志等手段没法定位问题,只能提供远程调试的方式定位问题. 1. 步骤 1.1 启动调试端口 业务有自己的端口,而为了能够调试业务,需要另外开启一个端口用于调试. 在java虚拟机 ...

  2. spark debug远程调试

    1.修改spark-env.sh export SPARK_MASTER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspe ...

  3. java程序开启远程调试、断点功能

    代码就是最好的文档 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 几点说明: -agentlib:jdwp 这个 ...

  4. 使用idea对生产环境的JAVA应用进行远程调试

    有时候明明测试环境没问题,部署到生产环境却有bug,于是想直接点生产环境打断点走到本地代码. JAVA自身支持调试功能,并提供了一个简单的调试工具--JDB,类似于功能强大的GDB,JDB也是一个字符 ...

  5. 使用 Eclipse 远程调试 Java 应用程序

    转载地址:使用 Eclipse 远程调试 Java 应用程序 远程调试对应用程序开发十分有用.例如,为不能托管开发平台的低端机器开发程序,或在专用的机器上(比如服务不能中断的 Web 服务器)调试程序 ...

  6. RASP | 远程Java应用的RASP调试教程

    远程Java应用的RASP调试教程 介绍 Java RASP是基于Java Agent技术实现的,而Java Agent代码无法独立启动,必须依赖于一个Java运行时程序才能运行. 如何调试一个Jav ...

  7. java作业远程联调_从零入门 Serverless | SAE 的远程调试和云端联调

    作者 | 弈川 阿里巴巴云原生团队 **导读:**本节课程包含三部分内容,前两个部分简单介绍远程调试以及端云联调的原理,最后在 Serverless 应用引擎中进行实际演示. 经过之前课程的学习,相信 ...

  8. grails的controller和action那点事---远程调试groovy代码

    最近由于项目需要,用到了grails,这玩意确实好用,生产率高有类型python的速度与简洁.仅第一印象,用的还不深入,说的不对请轻拍. 遇到的几个问题: 1. groovy远程调试 玩Java的应该 ...

  9. 远程调试运行在Resin上面的Web应用程序

    为什么80%的码农都做不了架构师?>>>    有时候,我们不得不放弃在本地调试我们的程序,把我们的程序先布署到服务器,然后把调试信息都记在日志中,用眼睛瞅日志来调试程序. 不是用这 ...

最新文章

  1. [tarjan] poj 1236 Network of Schools
  2. 不忘每份支持,网易云信感谢一路有你
  3. 用户 NT AUTHORITY\NETWORK SERVICE 登录失败解决方法
  4. JSONArray.fromObject不执行且不报错问题的解决
  5. CTF中遇到不知道文件类型_遇到孩子厌学不知道怎么沟通?做好这些策略,孩子肯定爱学...
  6. tensor索引[..., 0]
  7. Hive分区入门到精通
  8. linux中级之keepalived概念
  9. 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
  10. sqluldr2 用法简述
  11. android连接打印机打印pdf文件,如何在Android设备上打印PDF文件
  12. 高通驱动程序开发参考(一)
  13. 广电物联网大赛正式开启
  14. 袁腾飞讲述西方古代哲学思想
  15. AndroidStudio Launching ‘app‘ Time out 错误
  16. 两个苹果手机共享步数_实测:iPhone上“微信运动”步数可以作弊
  17. altium designer自动布线设置GND或其他网络不布线的方法
  18. [创业] 让创业者惊讶的19个真相
  19. 通过md5值删除重复文件
  20. [单片机框架] [kv_sys] 实现一个简易KV键值系统(最终版)

热门文章

  1. java 反爬虫_springboot反爬虫组件kk-anti-reptile的使用方法
  2. python 数据逐个验证_在python中验证数据的最佳方法是什么?
  3. hdl四位二进制计数器_四位二进制计数器这样接成十进制计数器
  4. 支付宝生活号 php,关于PHP框架Laravel怎么配置支付宝生活号应用网关呢?
  5. c语言中eof_C语言的标准 “输入输出”!今天是你学C语言的第几天?
  6. python2.7和3.5相互兼容吗_以与Python 2.7和Python 3.5兼容的方式使用abc.ABCMeta
  7. 前端笔记(7)css属性书写顺序,布局流程,chrome调试工具
  8. 用指针和函数的方法完成两个数的交换
  9. 如何向mysql表中添加数据类型_java中怎么把data类型的数据添加到数据库?
  10. SQL SERVER中Datetime时间的范围与.net的DateTime对象的区别