背景
有時候我們需要進(jìn)行遠(yuǎn)程的debug,本文研究如何進(jìn)行遠(yuǎn)程debug,以及使用 IDEA 遠(yuǎn)程debug的過程中的細(xì)節(jié)??赐昕梢越鉀Q你的一些疑惑。
配置
遠(yuǎn)程debug的服務(wù),以springboot微服務(wù)為例(springcloud的應(yīng)該差不多,我沒研究過)。首先,啟動springboot需要加上特定的參數(shù)。
推薦一個開源免費的 Spring Boot 實戰(zhàn)項目:
https://github.com/javastacks/spring-boot-best-practice
1、IDEA設(shè)置
高低版本的 IDEA 的設(shè)置可能界面有點不一樣,我用2020.1.1的。大致上差不多,自行摸索。
IDEA打開遠(yuǎn)程啟動的springboot應(yīng)用程序所對應(yīng)的
1.選擇 Edit Configuration
2.如圖,點擊加號,選擇Remote
3.配置,詳細(xì)步驟見圖
注意:注意端口別被占用。后續(xù)這個端口是用來跟遠(yuǎn)程的java進(jìn)程通信的。
可以注意到:切換不同的jdk版本,生成的腳本不一樣
選擇 jdk1.4,則為
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=50055
這就是你為什么搜其他博客,會有這種配置的原因,其實這個配置也是可行的。但更準(zhǔn)確應(yīng)該按照下面jdk5-8的配置
選擇 jdk 5-8,則為
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055
選擇 jdk9以上,則為
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:50055
據(jù)說因為jdk9變得安全了,遠(yuǎn)程調(diào)試只允許本地,如果要遠(yuǎn)程,則需要在端口前配置*
。
另外,關(guān)注公眾號Java技術(shù)棧,在后臺回復(fù)關(guān)鍵字:IDEA,閱讀我寫的大量 IDEA 教程。
2、啟動腳本改造
使用第一步得到的 Command line arguments for remote JVM
即可,即-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055
改造后的啟動腳本如下
nohup java \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 \
-jar remote-debug-0.0.1-SNAPSHOT.jar &
注意在windows中用 ^ 來進(jìn)行換行,例如
java ^
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 ^
-jar remote-debug-0.0.1-SNAPSHOT.jar
說明:
1、端口可隨意自己定,未被占用的都行,但是要和IDEA里的remote中設(shè)置的端口一致!其他參數(shù)照抄。詳細(xì)的參數(shù)解釋可以參照附錄或自己搜
2、remote-debug-0.0.1-SNAPSHOT.jar
改成給你自己的 jar 包名字
3、我給的腳本是后臺運行的,如不需要后臺運行,自行去掉 nohup
和 &
3、啟動springboot,啟動IDEA里的
IDEA 遠(yuǎn)程調(diào)試的細(xì)節(jié)
1、細(xì)節(jié)1:停在本地斷點,關(guān)閉程序后會繼續(xù)執(zhí)行嗎
如果遠(yuǎn)程調(diào)試在自己的斷點處停下來了,此時關(guān)閉IDEA中的項目停止運行,則還會繼續(xù)運行執(zhí)行完剩下的邏輯嗎?會的,這點比較不容易記住
以下面的代碼為例,在第一行停住了。然后IDEA中停掉,發(fā)現(xiàn)停掉之后控制臺還是打印了剩下的日志。
2、細(xì)節(jié)2:jar包代碼和本地不一致會怎么樣?
IDEA 里的代碼如果不和jar包的一致,會怎么樣。
結(jié)論:要保證和遠(yuǎn)程啟動的代碼一致。
否則你debug的時候的行數(shù)會對不上。報錯拋異常倒是不會。像這種還是能對得上行數(shù)的
比如你調(diào)試test1方法,test2方法在test1下面,在test2里加代碼,這樣并不影響test1中的行號,這種是可以在調(diào)試的時候準(zhǔn)確反應(yīng)行號的
3、細(xì)節(jié)3:日志打印在哪里?
日志不會打印在IDEA的控制臺上。即System.out
以及 log.info
還是打印在遠(yuǎn)程的。
@GetMapping("/test1")
public String test1() {
System.out.println("第一行");
System.out.println("第二行");
log.info("log 第一行");
log.info("log 第二行");
return "ok";
}
4、細(xì)節(jié)4:調(diào)試時其他人會不會卡住?
遠(yuǎn)程調(diào)試的時候,打了斷點,停住后會不會導(dǎo)致頁面的請求卡住。
比如你使用遠(yuǎn)程調(diào)試,別的QA在測試這個頁面,結(jié)果他們看到的結(jié)果是怎么樣的?會卡住嗎?會的,已經(jīng)實際遇到過這種情況了。
5、細(xì)節(jié)5:本地代碼修復(fù)bug遠(yuǎn)程調(diào)用的時候
如果在遠(yuǎn)程調(diào)試過程自己發(fā)現(xiàn)了bug,本地改好后重新啟動IDEA里的項目,再到頁面調(diào)用一次,能修復(fù)嗎?不能,運行的還是遠(yuǎn)程部署的jar中的代碼
這個直接擊碎了遠(yuǎn)程頁面點一點觸發(fā)本地代碼進(jìn)行debug的夢想。如果可以的話那調(diào)試代碼就方便太多。
6、細(xì)節(jié)6:這個不算遠(yuǎn)程調(diào)試的問題,是dropframe的問題,放在這里一起講了
關(guān)于drop frame
的問題,如果drop frame
了重新進(jìn)行調(diào)試,會不會插入2條記錄?
如圖 userMapper.insert(eo)
,本方法沒有使用 @Transactional
修飾,mapper方法執(zhí)行過后事務(wù)會被立即提交,則庫表里多了一行記錄,如果drop frame
后,再次進(jìn)行調(diào)試,再次執(zhí)行這代碼,于是又插入了一條記錄。
如果加上 @Transational
就不會有兩條記錄了,dropframe的時候事務(wù)沒被提交,再次執(zhí)行該插入代碼也不會插入2條。
關(guān)于什么是drop frame
7、細(xì)節(jié)7:跟上面一樣,是dropframe問題
如果把上述插入數(shù)據(jù)庫的邏輯,換成調(diào)用遠(yuǎn)程的接口,在dropframe后,再次執(zhí)行相同的代碼,會不會導(dǎo)致遠(yuǎn)程接口被執(zhí)行了2次?會的。
總結(jié)
好像感覺遠(yuǎn)程調(diào)試的用處也不是那么大,不能作為長期使用的調(diào)試工具。只能作為臨時調(diào)試的手段。
難點有幾個:
- 難保證本地代碼和遠(yuǎn)程一致,而且你也很難判斷是否一致
- 通過遠(yuǎn)程調(diào)試發(fā)現(xiàn)了bug,但是又不能立即修復(fù)后繼續(xù)調(diào)試,只能修復(fù)后部署后繼續(xù)遠(yuǎn)程調(diào)試
版權(quán)聲明:本文為CSDN博主「石頭wang」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/w8y56f/article/details/116493681
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協(xié)程要來了。。。
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優(yōu)雅的方式??!
5.《Java開發(fā)手冊(嵩山版)》最新發(fā)布,速速下載!文章來源:http://www.zghlxwxcb.cn/news/detail-664285.html
覺得不錯,別忘了隨手點贊+轉(zhuǎn)發(fā)哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-664285.html
到了這里,關(guān)于使用 IDEA 遠(yuǎn)程 Debug 調(diào)試,太實用了!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!