浅谈 Java JPDA

本文首发我的公众号《andyqian》,期待你的关注~

前言

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

能作什么?

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

初识JDPA

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

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

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

  1. 定义VM(虚拟机)的调试服务 JVM TI(Java VM Tool Interface)
    该组件提供了查看Java全部状态的职责。包括但不限于:JVM分析,监控,调试,线程分析,以及覆盖率分析等功能。其由JVM提供,与具体语言无关。浏览器

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

  3. Java实现的Debug Interface 接口 JDI - Java Debug Interface。能够理解为Java语言实现的Debug Inteface,Java程序员能够直接使用其编写远程调试工具,有不少的IDEA的远程调试功能底层就是经过调用JDI接口实现的。架构

小试牛刀

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

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默认参数,其中包括:

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

  2. JPDA_ADDRESS(JPDA地址以及端口号),默认为: localhost:8000,表示本机的8000端口。若是使用远程的话,一般将localhost:去掉,修改成特定的端口便可。

  3. JPDA_SUSPEND 表示经过JPDA启动后,JVM是否当即暂停,默认为n。

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

IDEA 步骤以下所示:

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

这样咱们就能够像在本地调试同样,进行断点调试了!

IDEA 以下所述:

最后

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


 

相关阅读:

说说Java注释

说说Java单元测试

一个Java细节!

初探JDK源码之默认字符集

这里写图片描述

 扫码关注,一块儿进步

我的博客: http://www.andyqian.com

相关文章
相关标签/搜索