Java遠程調試(Remote Debugging)的那些事

本文主要基于一篇英文原作翻譯而成接癌,刪減部分無用文字隔盛,添加了必要的注解和補充。

*英文原文是一篇對遠程調試講解很通俗的博文: *
http://blog.trifork.com/2014/07/14/how-to-remotely-debug-application-running-on-tomcat-from-within-intellij-idea/

前言

這篇文章將研究如何處理和調試那些只發(fā)生在生產環(huán)境(或其他遠程環(huán)境)而本地開發(fā)環(huán)境可能沒辦法重現(xiàn)的“問題”养匈。任何碰到過這種情況的人都不得不承認芍秆,試圖定位這種“問題”原因的過程,很大可能性是以一堆胡亂猜測而告終:一個非常耗時且低效的過程钱床。

還有一種場景荚斯, 你得到了一個可以部署的war/jar包,只有class沒有java源代碼查牌,而應用部署在本地/遠程后事期,是否可以調試? 讀完本文就明白怎么做了。

配置

遠程調試包括兩個步驟:

  1. 啟動Tomcat啟用遠程調試
  2. 用 IDE (這里用IntelliJ IDEA)要能夠調試遠程Tomcat應用

Tomcat啟用遠程調試

這里有多種方法可以做到纸颜,根據tomcat所運行的操作系統(tǒng)而有些微的不同兽泣。但是不管用哪種方法,這些配置的背后都做了同一件事:傳遞特定的啟動參數給 JVM胁孙,讓它啟用遠程調試(remote debugging)唠倦。
JVM 激活遠程調試的啟動參數有 JPDA_OPTS, CATALINA_OPTS 和 JAVA_OPTS。其中 JAVA_OPTS 是通常不建議使用的浊洞, 因為基于 JAVA_OPTS 的參數設定會暴露給所有的 JVM 應用牵敷, 而 CATALINA_OPTS 定義的設定值限制在Tomcat 內。

1 使用JPDA_OPTS

在 CATALINA_HOME/bin 目錄下創(chuàng)建可執(zhí)行腳本文件 setenv.sh ( Windows 創(chuàng)建 setenv.bat )法希,加入內容:

Linux setenv.sh

export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"

Windows setenv.bat

set JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"

這些參數要做的事情就是啟用遠程調試和配置有效的選項:

  • 指定運行的被調試應用和調試者之間的通信協(xié)議枷餐,(ie: transport=dt_socket)
  • 遠程被調試應用開通的端口,(ie: address=1043)苫亦, 可定義其他端口毛肋,比如9999
  • server=y 表示這個 JVM 即將被調試
  • suspend=n 用來告知 JVM 立即執(zhí)行怨咪,不要等待未來將要附著上/連上(attached)的調試者。如果設成 y, 則應用將暫停不運行润匙,直到有調試者連接上

suspend=y的一個比較適用的場景是诗眨,當debug一個會阻止應用成功啟動的問題時, 通過suspend=y可以確保調試者連上來之后再啟動應用孕讳,否則應用已經啟動報錯了再調試也沒意義了匠楚。*

當然上面的設置也可以直接放到 catalina.sh (catalina.bat )內,但是有個 setevn.* 額外的配置文件一直是最佳選擇厂财, tomcat會自動讀取芋簿。

要注意的是, 有些人會碰到過用另一個配置方法來啟用遠程調試:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=1043,suspend=n

-Xdebug and -Xrunjdw 與我們上面推薦的設置不同之處在于璃饱, 它是一種舊方式与斤,適用于JVM 小于 JAVA 5.0 的版本(包括5.0), 而 agentlib:jdwp適用于 JAVA 5.0 和以后版本荚恶。

最后通過下面的命令行啟動tomcat撩穿,即可完成tomcat啟用遠程調試啦。

$CATALINA_HOME/bin/catalina.sh jpda start
2 使用 JAVA_OPTS / CATALINA_OPTS

如果你是在 Windows 系統(tǒng)把 Tomcat 作為系統(tǒng)服務來運行的谒撼,直接打開 Apache Tomcat 的屬性對話框食寡,在Java Tab也添加啟動參數:

-agentlib:jdwp=transport=dt_socket,
address=1043,server=y,suspend=n

請確保每一條配置都是新的行,參數選項之間沒有空格

但如果Tomcat沒有作為 Windows 系統(tǒng)服務嗤栓, 啟用方法與前面類似冻河,在 setenv.bat 文件中寫入:

set CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"

如果運行在Linux上, setenv.sh 中寫入:

export CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=n"

按照普通的方式啟動Tomcat即可茉帅;

./startup.sh
或者
./catalina.sh start
3 使用JPDA啟動

最后一種啟用遠程調試的方式是用 JPDA 切換叨叙, 用如下的啟動命令將使用默認值自動啟用遠程調試,

catalina jpda start

該命令默認使用的設置是

-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n

如果你想要修改默認設置中的選項怎么辦堪澎?可以通過修改 Tomcat 需要的這些環(huán)境變量來實現(xiàn):

//JPDA_TRANSPORT: 指定 jpda 傳輸協(xié)議
//JPDA_ADDRESS: 指定遠程調試端口
//JPDA_SUSPEND: 指定 jvm 啟動暫緩

export JDPA_ADDRESS=”8080“

然后再運行 catalina jpda start 擂错, 那么遠程調試的端口將變成8080

配置Intellj Idea

確定遠程 Tomcat 啟動的應用已經開啟了遠程調試, 下一件事情就是配置Intellij Idea了樱蛤。這里仍然有兩種方式:Remote Tomcat 或者 Remote钮呀。

1 使用 Remote Tomcat 配置

首先保證 IDEA 里面已經打開了需要遠程調試的工程源碼,
然后點擊 Run ? Edit Configurations ? **+ **按鈕 ? Tomcat Server ? Remote

輸入必要的遠程 IP 地址和端口(Tomcat http端口);

然后轉到 Startup / Connnection Tab 頁昨凡,選擇 ”Debug", 輸入遠程調試端口爽醋,我們例子是 1043。

保存后便脊,開始 debug 啟動遠程調試蚂四,如果運行成功會顯示如下的界面,然后在源碼加斷點開始調試。

2 使用 Remote 配置(推薦)

第一個方法有個缺陷遂赠,你打開的工程源碼必須是編譯通過的工程久妆,否則會啟動會報錯;
而介紹的這第二種方法可以在你的工程目錄亂七八糟跷睦,不是一個完整的可以部署的工程筷弦,甚至是一個解壓縮的 war/ jar 的情況下都可以調試。

同上步驟抑诸,只是選擇“Remote"烂琴,然后輸入Name, 修改Host, Port (1043) 即可, 保存后開始Debug。

設置比 Remote Tomcat 更簡單蜕乡,這里介紹一個實際案例监右。

我手里有一個可部署的war包,沒有源碼异希,在遠程已經部署完畢。這時我想調試那個遠程應用绒瘦,怎么做呢称簿?

解壓縮war包到一個文件夾,然后用Intellij Idea打開這個文件夾惰帽,如圖的結構憨降,編譯的Class都在 WEB-INF/classes 目錄下

找到我要debug的那個class, 這里示例Handler.class, 通過Idea反編譯出來的類代碼,拷貝到一個新的文件Handler.java

雖然如圖可以看到各種的編譯錯誤该酗,但是完全不影響你啟動授药,代碼中加斷點和調試哦。

遠程JVM調試怎么工作的

一切源于被稱作 Agents 的東西呜魄。

運行著各種編譯過的 .class 文件的JVM悔叽, 有一種特性,可以允許外部的庫(Java或C++寫的libraries)在運行時注入到 JVM 中爵嗅。這些外部的庫就稱作 Agents, 他們有能力修改運行中 .class 文件的內容娇澎。

這些 Agents 擁有的這些 JVM 的功能權限, 是在 JVM 內運行的 Java Code 所無法獲取的睹晒, 他們能用來做一些有趣的事情趟庄,比如修改運行中的源碼, 性能分析等伪很。 像 JRebel 工具就是用了這些功能達到魔術般的效果戚啥。

傳遞一個 Agent Lib 給 JVM, 通過添加 agentlib:libname[=options] 格式的啟動參數即可辦到。像上面的遠程調試我們用的就是 **-agentlib:jdwp=... **來引入 jdwp 這個 Agent 的锉试。

jdwp 是一個 JVM 特定的 JDWP(Java Debug Wire Protocol) 可選實現(xiàn)猫十,用來定義調試者與運行JVM之間的通訊,它的是通過 JVM 本地庫的 jdwp.so 或者 jdwp.dll 支持實現(xiàn)的。

它到底是怎么工作的呢炫彩?

簡單來說匾七, jdwp agent 會建立運行應用的 JVM 和調試者(本地或者遠程)之間的橋梁。既然他是一個Agent Library, 它就有能力攔截運行的代碼江兢。

在 JVM 架構里昨忆, debugging 功能在 JVM 本身的內部是找不到的,它是一種抽象到外部工具的方式(也稱作調試者 debugger)杉允。這些調試工具或者運行在 JVM 的本地 或者在遠程邑贴。這是一種解耦,模塊化的架構叔磷。

更多關于遠程部署相關拢驾,以及 JDWP 的深入說明,大家有興趣可以自己研究一下改基。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末繁疤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秕狰,更是在濱河造成了極大的恐慌稠腊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸣哀,死亡現(xiàn)場離奇詭異架忌,居然都是意外死亡,警方通過查閱死者的電腦和手機我衬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門叹放,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挠羔,你說我怎么就攤上這事井仰。” “怎么了破加?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵糕档,是天一觀的道長。 經常有香客問我拌喉,道長速那,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任尿背,我火速辦了婚禮端仰,結果婚禮上,老公的妹妹穿的比我還像新娘田藐。我一直安慰自己荔烧,他們只是感情好吱七,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹤竭,像睡著了一般踊餐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臀稚,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天吝岭,我揣著相機與錄音,去河邊找鬼吧寺。 笑死窜管,一個胖子當著我的面吹牛,可吹牛的內容都是我干的稚机。 我是一名探鬼主播幕帆,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赖条!你這毒婦竟也來了失乾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤纬乍,失蹤者是張志新(化名)和其女友劉穎仗扬,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體蕾额,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年彼城,在試婚紗的時候發(fā)現(xiàn)自己被綠了诅蝶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡募壕,死狀恐怖调炬,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情舱馅,我是刑警寧澤缰泡,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站代嗤,受9級特大地震影響棘钞,放射性物質發(fā)生泄漏。R本人自食惡果不足惜干毅,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一宜猜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硝逢,春花似錦姨拥、人聲如沸绅喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柴罐。三九已至,卻和暖如春憨奸,著一層夾襖步出監(jiān)牢的瞬間革屠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工膀藐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屠阻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓额各,卻偏偏與公主長得像国觉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虾啦,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容