前言

  程序员在坊间有非常多有趣的故事,其中就有这么一则:”这个在我的电脑上是好的,没问题的呀,诺,你看咯,一定是你打开姿势不正确,浏览器版本不正确,操作系统不统一等,总之不是我代码问题(傲娇)”。看到这里,有些朋友也许会笑,甚至拿着这些梗来调侃我们程序员兄弟。我是第一个不同意的,做技术的都知道,上面的回答一点毛病都没有,甚至称得上有理有据呀。就拿前端来说:编写的代码,在chrome浏览器上能完美呈现,在Firefox上就可能没那么完美,在Safari浏览器上就只能勉强显示了,在IE上就可能直接罢工了。同样的,后端其实也是一样的。就说Java吧,同样的代码,在windows上开发,联调,部署就是没问题,一到Linux上就死翘翘。这是环境差异导致代码不兼容发生的惨案,这锅我们程序员可不背。但话又说回来了,我们程序员眼里是揉不得半点沙子的,这问题,还得我们来解决。你看,隔壁前端涛哥就在写代码兼容浏览器呢,后端翔哥就在分析跨平台问题呢。

  能做什么?

  程序员在面对一个未知的知识时,心中总有一丝顾虑,这东西有什么用呢?能解决什么问题呢?是否能提高我的效率呢?在回答这个问题之前,那么我先说说,我在日常工作中是怎么解决问题的。在开发阶段,先单元测试,再联调测试。在这期间遇到问题。先通过日志分析问题,如果已有的日志不足以分析出问题。就想办法,还原问题。问题还原后,先检查本地开发环境是存在该问题,捋一遍逻辑,如果看不出来的话,就进行本地debug。一步一步调试,看程序究竟在哪一步出错。这样下来,大部分问题也能得以解决。但像上面讲到的在windows / mac 上开发,Linux部署时出现的问题。在详细介绍利器之前,我想,有些童鞋可能会考虑安装一个与部署机器一致的系统进行Debug,进行调试来解决问题。当然了,这不是不可以。只是我想分享一个更好,更省心的方法给你,多留一点给你喝咖啡,休息的时间。

  初识JDPA

  言归正传,现在开始介绍今天的主角Java Debug利器 - JPDA。说利器一点都不为过,但更严谨一点的,更官方的描述是这样的:

  JPDA 全称: Java Platform Debugger Architecture (Java调试器架构)。是一套Java虚拟机自带的调试体系。

  JPDA 其实由三个部分组成,分别是:

  定义VM(虚拟机)的调试服务 JVM TI(Java VM Tool Interface)。

  该组件提供了查看Java所有状态的职责。包括但不限于:JVM分析,监控,调试,线程分析,以及覆盖率分析等功能。其由JVM提供,与具体语言无关。

  定义调试器与调试者通信协议的 JDWP - Java Debug Wire Protocol。定义的主要是调试者与调试器通信时的传输信息以及请求数据格式。但不限制其传输机制。例如:有的使用socket,有的使用serial line,有的使用share money 等等。

  Java实现的Debug Interface 接口 JDI - Java Debug Interface。可以理解为Java语言实现的Debug Inteface,Java程序员可以直接使用其编写远程调试工具,有很多的IDEA的远程调试功能底层就是通过调用JDI接口实现的。

  小试牛刀

  通过上面简述,现在我们已经对JPDA已经有一些概念了,现在介绍下在IDEA+Tomcat下如何实现远程调试。首先,我们可以在远程Tomcat下修改JPDA参数,Linux下打开 tomcat目录/bin/catalina.sh 文件,找到如下代码所述:

  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

  Windows 下则在:

  tomcat/bin/catalina.bat 找到如下代码:

  if not %1 == jpda goto noJpda

  set JPDA=jpda

  if not %JPDA_TRANSPORT% == goto gotJpdaTransport

  set JPDA_TRANSPORT=dt_socket

  :gotJpdaTransport

  if not %JPDA_ADDRESS% == goto gotJpdaAddress

  set JPDA_ADDRESS=localhost:8000

  :gotJpdaAddress

  if not %JPDA_SUSPEND% == goto gotJpdaSuspend

  set JPDA_SUSPEND=n

  :gotJpdaSuspend

  if not %JPDA_OPTS% == goto gotJpdaOpts

  set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

  :gotJpdaOpts

  shift

  :noJpda

  上述参数定义了Tomcat下JPDA默认参数,其中包括:

  JPDA_TRANSPORT(调试者与调试器传输的协议)。上述表示使用socket方式进行传输。

  JPDA_ADDRESS(JPDA地址以及端口号),默认为: localhost:8000,表示本机的8000端口。如果使用远程的话,通常将localhost:去掉,修改为特定的端口即可。

  JPDA_SUSPEND 表示通过JPDA启动后,JVM是否立即暂停,默认为n。

  修改配置后,我们使用 ./catalina.sh jpda start 命令进行启动tomcat即可。

  IDEA 步骤如下所示:

  Edit Configurations-Remote-修改Host以及Port端口即可-点击Apply即可!

  这样我们就可以像在本地调试一样,进行断点调试了!

  IDEA 如下所述:

  最后

  现在我们能够在远程机器上像本地机器一样,进行调试,简直不要太爽。但有一点是需要格外注意的,那就是不建议在生产环境上是使用这种方式进行调试。因为我们都知道调试过程中会阻塞其它的请求,这样就会造成其它的请求直接block,造成得不偿失的后果。在生产环境还是建议通过分析日志,以及尝试在测试环境还原等手段来解决生产问题。不建议使用这么激进的方式来解决。

浅谈 Java JPDA的更多相关文章

  1. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  2. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  3. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  4. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  5. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  6. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...

  7. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  8. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  9. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

随机推荐

  1. Eloquent JavaScript #08# Bugs and Errors

    索引 Notes strict mode js类型 js测试 Debugging Exceptions finally 异常分支 Exercise Retry The locked box Notes ...

  2. VMware Workstation Pro14安装

    1. 下载VMware Workstation Pro14,注意,这个链接支持win7 64及以上系统 2.  点击进入安装 3. 接受许可协议 4. 选择安装目录,是否选择增强型键盘驱动程序 5. ...

  3. HashMap的实现原理总结

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象. 当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到b ...

  4. unknown variable 'log_bin_basename'

    今天在处理一问题时,在my.cnf中设置了log_bin_basename=/DATA/log-bin,在启动时报unknown variable 'log_bin_basename' 经查mysql ...

  5. Android之xml解析

    利用类下载器解析Xml文件要解析的xml文件<?xml version="1.0" encoding="utf-8"?><info> & ...

  6. Python带_的变量或函数命名

    python中的标识符可以包含数字.字母和_,但必须以字母或者_开头,其中以_开头的命名一般具有特殊的意义. 前后均带有双下划线__的命名 一般用于特殊方法的命名,用来实现对象的一些行为或者功能,比如 ...

  7. volatile的陷阱

         对于volatile关键字,大部分C语言的教程都是一笔带过,并没有做太深入的分析,所以这里简单的整理了一些 关于volatile的使用注意事项.实际上从语法上来看volatile和const ...

  8. dijkstra最短路

    感觉自己太懒了,以后每天更博客激励自己吧. //时间复杂度O(n*n)的最短路算法 //首先需要设置一个访问数组v[maxn],一个数组d[maxn], memset(v,,sizeof(v)); ; ...

  9. C# asp:FileUpload上传文件使用JS实现预览效果

    js代码: <script type="text/javascript"> //下面用于图片上传预览功能 function setImagePreview() { va ...

  10. Python3基础 dict 推导式 生成10以内+奇数的值为True 偶数为False的字典

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...