使用Eclipse進(jìn)行遠(yuǎn)程調(diào)試
對(duì)于使用Eclipse進(jìn)行日常編程工作的工程師來(lái)說(shuō),調(diào)試是每天都在進(jìn)行的工作。針對(duì)一般意義上的調(diào)試過(guò)程,相信每一位工程師朋友都熟練掌握了。這里介紹幾個(gè)調(diào)試中比較實(shí)用的高級(jí)功能。
Eclipse遠(yuǎn)程調(diào)試
Java自身支持調(diào)試功能,并提供了一個(gè)簡(jiǎn)單的調(diào)試工具--JDB,類(lèi)似于功能強(qiáng)大的GDB,JDB也是一個(gè)字符界面的調(diào)試環(huán)境,并支持設(shè)置斷點(diǎn),支持線程線級(jí)的調(diào)試。
由于部署環(huán)境的差異性,相信很多朋友都碰到過(guò)開(kāi)發(fā)環(huán)境正常測(cè)試過(guò)的功能在測(cè)試環(huán)境甚至生產(chǎn)環(huán)境下出現(xiàn)bug的情況。一般情況下,生產(chǎn)環(huán)境可以采取的手段比較單一,即通過(guò)日志的方式獲取運(yùn)行中的環(huán)境上下文,分析日志文件并嘗試重現(xiàn)bug。這會(huì)帶來(lái)的問(wèn)題還是不少的,首先,日志的分析是一項(xiàng)比較耗時(shí)的工作;其次,現(xiàn)有的日志記錄不一定能反映出問(wèn)題,你可能需要多次重復(fù)這個(gè)過(guò)程(分析日志->猜測(cè)問(wèn)題->加日志->部署->獲取日志)來(lái)慢慢逼近問(wèn)題。倘若是測(cè)試環(huán)境,我們還多了一項(xiàng)可供選擇的手段——遠(yuǎn)程調(diào)試——將程序在測(cè)試環(huán)境中以debug模式啟動(dòng),在本機(jī)使用Eclipse在工程中設(shè)置斷點(diǎn)進(jìn)行調(diào)試。
【具體步驟】
- 修改服務(wù)器啟動(dòng)參數(shù)
在服務(wù)器上的進(jìn)程啟動(dòng)參數(shù)中添加:
-Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=n
連接到myhost:6666提供的調(diào)試服務(wù)。
-Xdebug通知JVM工作在DEBUG模式下,
-Xrunjdwp通知JVM使用(Java debug wire protocol)運(yùn)行調(diào)試環(huán)境。該參數(shù)同時(shí)包含了一系列的調(diào)試選項(xiàng):
transport指定了調(diào)試數(shù)據(jù)的傳送方式;
dt_socket是指用SOCKET模式;
server=y/n VM 是否需要作為調(diào)試服務(wù)器執(zhí)行;
suspend=y/n 是否在調(diào)試客戶(hù)端建立連接之后啟動(dòng) VM 。
設(shè)置完成后,啟動(dòng)服務(wù)端。
2. 啟動(dòng)本地代碼
設(shè)置 Debug configurations-->Remote Java Application

注意在點(diǎn)擊【Debug】按鈕之前,一定不要多次“啟動(dòng)本地程序”,否則就會(huì)出現(xiàn)"Failed to connect to remote VM. Connection refused"異常,如下圖所示:

3. 調(diào)試遠(yuǎn)程客戶(hù)端
點(diǎn)擊【Debug configurations】中的debug按鈕,運(yùn)行效果如下,接下來(lái),就和本地調(diào)試一模一樣了。在調(diào)試過(guò)程中,日志打印在遠(yuǎn)程服務(wù)器,本地console中看不到日志信息。調(diào)試的時(shí)候需要一個(gè)Http客戶(hù)端發(fā)起請(qǐng)求,比如postman等等。

條件斷點(diǎn)
如果需要對(duì)循環(huán)中的數(shù)據(jù)進(jìn)行調(diào)試,使用條件斷點(diǎn)是個(gè)不錯(cuò)的選擇。將斷點(diǎn)設(shè)置在指定的位置上,右鍵進(jìn)一步設(shè)置斷點(diǎn)屬性,如下:

調(diào)試時(shí),程序會(huì)中斷在符合條件的代碼處。
異常斷點(diǎn)
斷點(diǎn)不僅可以設(shè)置在某一行,也可以針對(duì)整個(gè)工程進(jìn)行設(shè)置。假設(shè)你知道程序會(huì)在某個(gè)地方拋出NullPointerException,可是并不是每一次運(yùn)行都會(huì)出現(xiàn),就可以為工程設(shè)置異常斷點(diǎn),如下:

備注轉(zhuǎn)自如下兩篇博文,稍作修改。
1. http://greatestrabit.github.io/2016/06/23/debug/.
2. http://www.rzrgm.cn/zjrodger/p/6947058.html.
Buy me a coffee. ?Get red packets.
浙公網(wǎng)安備 33010602011771號(hào)