概述
對(duì)于分布式系統(tǒng)的調(diào)試不知道大家有什么好的方法士聪。對(duì)于我來(lái)說(shuō),在知道遠(yuǎn)程調(diào)試這個(gè)方法之前就是在代碼中打各種log猛蔽,然后重新部署剥悟,上線,調(diào)試曼库,這樣比較費(fèi)時(shí)区岗。今天咱們來(lái)了解了解Java遠(yuǎn)程調(diào)試這個(gè)牛逼的功能,本文以Intellij IDEA為例講解怎么使用遠(yuǎn)程調(diào)試毁枯。以Thrift入門教程這篇文章中使用的程序作為例子慈缔。這個(gè)程序由Thrift服務(wù)端和客戶端組成。描述一下遠(yuǎn)程調(diào)試需要解決的問(wèn)題:
服務(wù)端程序運(yùn)行在一臺(tái)遠(yuǎn)程服務(wù)器上后众,我們可以在本地服務(wù)端的代碼(前提是本地的代碼必須和遠(yuǎn)程服務(wù)器運(yùn)行的代碼一致)中設(shè)置斷點(diǎn)胀糜,每當(dāng)有請(qǐng)求到遠(yuǎn)程服務(wù)器時(shí)時(shí)能夠在本地知道遠(yuǎn)程服務(wù)端的此時(shí)的內(nèi)部狀態(tài)。
下面按照步驟介紹怎么遠(yuǎn)程debug蒂誉。
使用特定JVM參數(shù)運(yùn)行服務(wù)端代碼
要讓遠(yuǎn)程服務(wù)器運(yùn)行的代碼支持遠(yuǎn)程調(diào)試教藻,則啟動(dòng)的時(shí)候必須加上特定的JVM參數(shù),這些參數(shù)是:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}
其中的${debug_port}是用戶自定義的右锨,為debug端口括堤,本例以5555端口為例。
本地連接遠(yuǎn)程服務(wù)器debug端口
打開(kāi)Intellij IDEA绍移,在頂部靠右的地方選擇"Edit Configurations..."悄窃,進(jìn)去之后點(diǎn)擊+號(hào),選擇"Remote"蹂窖,按照下圖的只是填寫紅框內(nèi)的內(nèi)容轧抗,其中host為遠(yuǎn)程代碼運(yùn)行的機(jī)器的ip/hostname,port為上一步指定的debug_port瞬测,本例是5555
然后點(diǎn)擊Apply横媚,最后點(diǎn)擊OK即可
啟動(dòng)debug模式
現(xiàn)在在上一步選擇"Edit Configurations..."的下拉框的位置選擇上一步創(chuàng)建的remote的名字,然后點(diǎn)擊右邊的debug按鈕(長(zhǎng)的像臭蟲那個(gè))月趟,看控制臺(tái)日志灯蝴,如果出現(xiàn)類似"Connected to the target VM, address: 'xx.xx.xx.xx:5555', transport: 'socket'"的字樣,就表示連接成功過(guò)了孝宗。
設(shè)置斷點(diǎn)穷躁,開(kāi)始調(diào)試
遠(yuǎn)程debug模式已經(jīng)開(kāi)啟,現(xiàn)在可以在需要調(diào)試的代碼中打斷點(diǎn)了因妇,比如:
如圖中所示问潭,如果斷點(diǎn)內(nèi)有√猿诸,則表示選取的斷點(diǎn)正確疏虫。
現(xiàn)在在本地發(fā)送一個(gè)到遠(yuǎn)程服務(wù)器的請(qǐng)求刁卜,看本地控制臺(tái)的bug界面,劃到debugger這個(gè)標(biāo)簽迈着,可以看到當(dāng)前遠(yuǎn)程服務(wù)的內(nèi)部狀態(tài)(各種變量)已經(jīng)全部顯示出來(lái)了去枷,并且在剛才設(shè)置了斷點(diǎn)的地方怖辆,也顯示了該行的變量值。
本文首發(fā)于我的個(gè)人技術(shù)博客:http://qifuguang.me/2015/09/18/IntelliJ遠(yuǎn)程調(diào)試教程
如果你喜歡我的文章删顶,請(qǐng)關(guān)注我的微信訂閱號(hào):“機(jī)智的程序猿”竖螃,更多精彩,僅在其中: