淺談 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

相關文章
相關標籤/搜索