前言

  程序员在坊间有非常多有趣的故事,其中就有这么一则:”这个在我的电脑上是好的,没问题的呀,诺,你看咯,一定是你打开姿势不正确,浏览器版本不正确,操作系统不统一等,总之不是我代码问题(傲娇)”。看到这里,有些朋友也许会笑,甚至拿着这些梗来调侃我们程序员兄弟。我是第一个不同意的,做技术的都知道,上面的回答一点毛病都没有,甚至称得上有理有据呀。就拿前端来说:编写的代码,在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. Golang对文件读写操作

    package main import ( "bufio" "fmt" "io" "os" ) //写 func Wri ...

  2. 【题解】 Luogu CF375D Tree and Queries

    原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...

  3. Python学习基础(三)——装饰器,列表生成器,斐波那契数列

    装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...

  4. Android - Resource 之 Menu 小结

    定义一个application的菜单,由MenuInflater召唤. 位置: res/menu/filename.xml 类型:指向Menu resource 文法: <?xml versio ...

  5. (4opencv)对OpenCV中“旋转”的思考和实验

    ​    我记得曾经有人对OpenCV的旋转吐槽,意思是它自己没有很好的关于选择的算法.在新的版本里面添加了这些函数(我还没有时间去看是什么时候pr的).现在一个比较棘手的问题,就是OpenCV中旋转 ...

  6. poj 1159 Palindrome - 动态规划

    A palindrome is a symmetrical string, that is, a string read identically from left to right as well ...

  7. Java排序算法之选择排序

    一.算法原理 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与arrr[0]交换:第2趟,在待排序 ...

  8. Python3基础 dict fromkeys 多个键对应相同的值

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

  9. Python3基础 list for+continue 输出1-50之间的偶数

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

  10. 那些离不开的 Chrome 扩展插件

    虽然Chrome浏览器是个吃内存的怪兽,但是,它却因为启动速度.调试功能等成为了程序猿的必备浏览器!今天有时间,整理一下自己最常用的一些Chrome扩展吧: 常用网页浏览非开发类扩展: Tamperm ...