IntelliJ IDEA進(jìn)行遠(yuǎn)程調(diào)試(Remote Debugging)的操作教程
一、什么是遠(yuǎn)程調(diào)試?
遠(yuǎn)程調(diào)試(Remote Debugging)是指在本地開(kāi)發(fā)環(huán)境(如 IntelliJ IDEA)中,連接并調(diào)試運(yùn)行在遠(yuǎn)程機(jī)器(如測(cè)試服務(wù)器、預(yù)發(fā)環(huán)境、生產(chǎn)服務(wù)器、Docker 容器、Kubernetes Pod 等)上的 Java 應(yīng)用程序。
它允許開(kāi)發(fā)者像調(diào)試本地代碼一樣,在遠(yuǎn)程 JVM 中:
- 設(shè)置斷點(diǎn)(Breakpoints)
- 單步執(zhí)行(Step Over/Into/Out)
- 查看調(diào)用棧(Call Stack)
- 監(jiān)控變量值(Variables)
- 評(píng)估表達(dá)式(Evaluate Expression)
- 修改運(yùn)行時(shí)狀態(tài)(謹(jǐn)慎使用)
遠(yuǎn)程調(diào)試是排查線上問(wèn)題、分析復(fù)雜邏輯、驗(yàn)證部署行為的核心手段。
二、遠(yuǎn)程調(diào)試的核心原理
遠(yuǎn)程調(diào)試基于 Java Platform Debugger Architecture (JPDA),它是一個(gè)由三部分組成的調(diào)試架構(gòu):
| 組件 | 說(shuō)明 |
|---|---|
| JVMTI (JVM Tool Interface) | JVM 內(nèi)部的本地接口,提供對(duì) JVM 內(nèi)部狀態(tài)(線程、類、內(nèi)存等)的訪問(wèn)。 |
| JDWP (Java Debug Wire Protocol) | 調(diào)試器與目標(biāo) JVM 之間的通信協(xié)議,定義了調(diào)試命令和數(shù)據(jù)格式。 |
| JDI (Java Debug Interface) | Java 層的 API,供調(diào)試客戶端(如 IDEA)調(diào)用,用于控制和監(jiān)控遠(yuǎn)程 JVM。 |
工作流程:
- 遠(yuǎn)程 JVM 以調(diào)試模式啟動(dòng),加載
jdwpagent,監(jiān)聽(tīng)指定端口。 - 本地 IDEA 作為 JDI 客戶端,通過(guò) JDWP 協(xié)議連接到遠(yuǎn)程 JVM。
- 雙方建立連接后,IDEA 可以發(fā)送調(diào)試指令(如“在某行設(shè)置斷點(diǎn)”),遠(yuǎn)程 JVM 執(zhí)行并返回結(jié)果。
三、遠(yuǎn)程調(diào)試的兩種模式(Debugger Mode)詳解
在 IntelliJ IDEA 的 Remote JVM Debug 配置中,Debugger mode 有兩個(gè)選項(xiàng):
1. Attach to remote JVM(連接到遠(yuǎn)程 JVM)
- 含義:本地 IDEA 主動(dòng)連接到一個(gè)已經(jīng)啟動(dòng)并處于監(jiān)聽(tīng)狀態(tài)的遠(yuǎn)程 JVM。
- 適用場(chǎng)景:絕大多數(shù)情況都使用此模式。
- 遠(yuǎn)程 JVM 啟動(dòng)參數(shù):
server=y(表示 JVM 是服務(wù)器端,等待連接)。 - 流程:
- 先在遠(yuǎn)程服務(wù)器上啟動(dòng)應(yīng)用(帶調(diào)試參數(shù))。
- 再在 IDEA 中點(diǎn)擊
Debug按鈕連接。
- 優(yōu)點(diǎn):簡(jiǎn)單直接,適用于大多數(shù)部署環(huán)境。
2. Listen to remote JVM(監(jiān)聽(tīng)遠(yuǎn)程 JVM)
- 含義:本地 IDEA 開(kāi)啟一個(gè)端口,等待遠(yuǎn)程 JVM 主動(dòng)連接到本地。
- 適用場(chǎng)景:
- 遠(yuǎn)程服務(wù)器無(wú)法訪問(wèn)本地(如本地在內(nèi)網(wǎng),遠(yuǎn)程在公網(wǎng))。
- 防火墻只允許出站(outbound)連接。
- 使用反向代理或 SSH 隧道。
- 遠(yuǎn)程 JVM 啟動(dòng)參數(shù):
server=n(表示 JVM 是客戶端,主動(dòng)連接)。 - 流程:
- 先在 IDEA 中啟動(dòng)
Listen模式,等待連接。 - 再在遠(yuǎn)程服務(wù)器上啟動(dòng)應(yīng)用,參數(shù)中指定連接到本地 IP 和端口。
- 先在 IDEA 中啟動(dòng)
- 示例參數(shù):
-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=localhost:5005
(此時(shí) address 指的是本地 IDEA 所在機(jī)器的地址)
? 推薦選擇:Attach to remote JVM。除非有特殊網(wǎng)絡(luò)限制,否則無(wú)需使用
Listen模式。
四、傳輸方式(Transport)詳解
Transport 定義了 JDWP 使用的底層通信機(jī)制。
1. Socket(套接字)
- 含義:使用 TCP/IP 網(wǎng)絡(luò)套接字進(jìn)行通信。
- 格式:
transport=dt_socket - 適用場(chǎng)景:99% 的情況都使用此方式,支持跨機(jī)器、跨網(wǎng)絡(luò)調(diào)試。
- 優(yōu)點(diǎn):通用、穩(wěn)定、支持遠(yuǎn)程連接。
- 缺點(diǎn):需要網(wǎng)絡(luò)可達(dá)。
2. Shared Memory(共享內(nèi)存)
- 含義:使用操作系統(tǒng)提供的共享內(nèi)存機(jī)制進(jìn)行通信。
- 格式:
transport=dt_shmem - 適用場(chǎng)景:僅限于同一臺(tái)機(jī)器上的調(diào)試(如本地調(diào)試另一個(gè) JVM 進(jìn)程)。
- 優(yōu)點(diǎn):速度快,無(wú)網(wǎng)絡(luò)開(kāi)銷(xiāo)。
- 缺點(diǎn):僅支持 Windows 和部分 Unix 系統(tǒng),且必須在同一臺(tái)物理機(jī)上。
? 推薦選擇:Socket。除非你明確在本機(jī)調(diào)試另一個(gè) JVM,否則一律選擇 Socket。
五、完整操作流程
第一步:在 IntelliJ IDEA 中創(chuàng)建遠(yuǎn)程調(diào)試配置
1. 打開(kāi)配置窗口
- 方法一:點(diǎn)擊右上角的
Add Configuration...(加號(hào)圖標(biāo))。 - 方法二:菜單欄 →
Run→Edit Configurations...
2. 添加新配置
- 點(diǎn)擊左上角
+號(hào) → 選擇Remote JVM Debug
3. 填寫(xiě)配置項(xiàng)
| 配置項(xiàng) | 說(shuō)明 |
|---|---|
| Name | 自定義名稱,如 MyApp-Prod-Debug |
| Debugger mode | 選擇 Attach to remote JVM(推薦) |
| Transport | 選擇 Socket(推薦) |
| Host | 遠(yuǎn)程服務(wù)器的 IP 地址或主機(jī)名(如 192.168.1.100 或 myserver.example.com) |
| Port | 調(diào)試端口,如 5005(需與遠(yuǎn)程一致) |
| Use module classpath | 選擇你要調(diào)試的模塊(確保源碼路徑正確) |
| Before launch | 可選,如 Build 項(xiàng)目,確保 class 文件是最新的 |
4. 查看并復(fù)制生成的 JVM 參數(shù)
- IDEA 會(huì)自動(dòng)生成如下格式的參數(shù):
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
- 關(guān)鍵參數(shù)解析:
transport=dt_socket:使用 TCP 通信。server=y:當(dāng)前 JVM 作為調(diào)試服務(wù)器,等待連接。suspend=n:應(yīng)用啟動(dòng)后不暫停,直接運(yùn)行。y表示暫停,直到調(diào)試器連接才繼續(xù)(調(diào)試啟動(dòng)問(wèn)題時(shí)可用,但生產(chǎn)慎用)。address=*:5005:監(jiān)聽(tīng)所有網(wǎng)絡(luò)接口的 5005 端口。也可寫(xiě)address=0.0.0.0:5005或address=192.168.1.100:5005。
操作:復(fù)制這一整行參數(shù),用于下一步。
5. 保存配置
點(diǎn)擊 OK 或 Apply 保存。



第二步:在遠(yuǎn)程服務(wù)器上啟動(dòng)應(yīng)用并啟用調(diào)試
1. 登錄遠(yuǎn)程服務(wù)器
ssh user@your-remote-server-ip
2. 修改啟動(dòng)命令
將 IDEA 生成的參數(shù)插入到 java 命令中。
示例 1:普通 JAR 包
java \ -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 \ -jar myapp.jar
示例 2:Spring Boot
java \ -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 \ -jar my-spring-boot-app.jar
示例 3:Tomcat
編輯 bin/catalina.sh:
export CATALINA_OPTS="$CATALINA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
示例 4:Docker
CMD ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "app.jar"]
并確保 docker run 映射端口:
-p 5005:5005
3. 啟動(dòng)應(yīng)用
運(yùn)行修改后的命令。
4. 驗(yàn)證端口監(jiān)聽(tīng)
netstat -an | grep 5005 # 或 lsof -i :5005
應(yīng)看到 LISTEN 狀態(tài)。
5. 檢查防火墻
確保遠(yuǎn)程服務(wù)器防火墻允許該端口:
# CentOS/RHEL firewall-cmd --list-ports firewall-cmd --add-port=5005/tcp --permanent firewall-cmd --reload # Ubuntu ufw allow 5005
第三步:在 IDEA 中連接并調(diào)試
- 選擇你創(chuàng)建的遠(yuǎn)程調(diào)試配置。
- 點(diǎn)擊
Debug按鈕(蟲(chóng)子圖標(biāo))。 - IDEA 會(huì)連接到
<Host>:<Port>。 - 連接成功后,
Debug窗口顯示“Connected to the target VM”。 - 在源碼中設(shè)置斷點(diǎn),觸發(fā)邏輯,開(kāi)始調(diào)試。
六、常見(jiàn)問(wèn)題與解決方案
1. Connection refused / Connection timed out
- 原因:
- 遠(yuǎn)程 JVM 未開(kāi)啟調(diào)試。
- 端口號(hào)不一致。
- 防火墻/安全組阻止。
- 網(wǎng)絡(luò)不通(跨 VPC、跨區(qū)域)。
- 解決方案:
- 檢查遠(yuǎn)程啟動(dòng)命令是否包含
-agentlib:jdwp。 netstat -an | grep <port>驗(yàn)證監(jiān)聽(tīng)。telnet <ip> <port>測(cè)試連通性。- 檢查云服務(wù)商安全組(如 AWS Security Group、阿里云安全組)。
- 檢查遠(yuǎn)程啟動(dòng)命令是否包含
2. Connected but breakpoints are not hit (Unverified Breakpoints)
- 原因:
- 源代碼版本不一致(最常見(jiàn))。
- 類文件被混淆或優(yōu)化。
- 斷點(diǎn)位置無(wú)效(空行、注釋行)。
- 代碼未被執(zhí)行。
- 解決方案:
- 確保本地代碼與遠(yuǎn)程部署包完全一致(Git Commit ID、構(gòu)建時(shí)間戳)。
- 使用
jdeprscan或反編譯工具(如 JD-GUI)對(duì)比 class 文件。 - 確認(rèn)斷點(diǎn)設(shè)置在有效代碼行。
- 添加日志確認(rèn)代碼路徑是否執(zhí)行。
3. Application hangs during debugging
- 原因:
- 斷點(diǎn)處執(zhí)行耗時(shí)操作(數(shù)據(jù)庫(kù)查詢、HTTP 調(diào)用)。
- 死鎖或線程阻塞。
- 網(wǎng)絡(luò)延遲高。
- 解決方案:
- 使用條件斷點(diǎn)(右鍵斷點(diǎn) →
More→Condition)。 - 在
Debug窗口查看線程狀態(tài)(Frames)。 - 避免在高頻方法中設(shè)置斷點(diǎn)。
- 使用條件斷點(diǎn)(右鍵斷點(diǎn) →
4. Only works once, second connection fails
- 原因:
- 某些 JVM 實(shí)現(xiàn)(如舊版 HotSpot)不支持多客戶端連接。
- 應(yīng)用重啟后未重新開(kāi)啟調(diào)試。
- 解決方案:
- 重啟遠(yuǎn)程應(yīng)用。
- 確保每次調(diào)試前應(yīng)用以調(diào)試模式啟動(dòng)。
- 使用不同端口測(cè)試。
5. Security Risk: Exposing Debug Port
- 風(fēng)險(xiǎn):開(kāi)放
5005端口可能被惡意連接,導(dǎo)致信息泄露或代碼注入。 - 解決方案:
- 僅在非生產(chǎn)環(huán)境使用。
- 生產(chǎn)環(huán)境使用時(shí),限制 IP 白名單。
- 調(diào)試后立即關(guān)閉調(diào)試參數(shù)并重啟應(yīng)用。
- 使用 SSH 隧道加密連接:
ssh -L 5005:localhost:5005 user@remote-server
然后 IDEA 連接 localhost:5005。
七、最佳實(shí)踐與安全建議
- 永遠(yuǎn)不要在生產(chǎn)環(huán)境長(zhǎng)期開(kāi)啟遠(yuǎn)程調(diào)試。
- 使用臨時(shí)調(diào)試:發(fā)現(xiàn)問(wèn)題 → 開(kāi)啟調(diào)試 → 排查 → 關(guān)閉 → 重啟。
- 嚴(yán)格版本控制:使用 Git + CI/CD 確保部署包與源碼一致。
- 使用專用端口:避免使用
5005,選擇不常見(jiàn)的端口(如9999)。 - 限制訪問(wèn) IP:通過(guò)防火墻或安全組限制調(diào)試端口的訪問(wèn)來(lái)源。
- 使用 SSH 隧道:加密調(diào)試通信,防止中間人攻擊。
- 避免
suspend=y:除非排查啟動(dòng)問(wèn)題,否則使用suspend=n。 - 記錄調(diào)試日志:記錄調(diào)試時(shí)間、IP、操作內(nèi)容,便于審計(jì)。
八、高級(jí)技巧
1. 條件斷點(diǎn)(Conditional Breakpoint)
- 右鍵斷點(diǎn) →
More→Condition - 輸入表達(dá)式,如
user.getId() == 1001 - 僅當(dāng)條件為真時(shí)中斷。
2. 日志斷點(diǎn)(Logpoint)
- 右鍵斷點(diǎn) →
More→ 勾選Evaluate and log - 輸入要打印的內(nèi)容,如
User logged in: ${user.getName()} - 不中斷執(zhí)行,僅輸出日志。
3. 異常斷點(diǎn)(Exception Breakpoint)
Run→View Breakpoints→+→Java Exception Breakpoints- 設(shè)置在拋出特定異常時(shí)中斷。
4. 遠(yuǎn)程調(diào)試 Docker 容器
- 啟動(dòng)容器時(shí)映射調(diào)試端口:
-p 5005:5005 - 確保容器內(nèi) JVM 監(jiān)聽(tīng)
0.0.0.0(address=*:5005)
九、總結(jié)
遠(yuǎn)程調(diào)試是 Java 開(kāi)發(fā)者必須掌握的核心技能。通過(guò)本教程,您已掌握:
- 原理:JPDA 三件套(JVMTI, JDWP, JDI)
- 模式:
AttachvsListen - 傳輸:
SocketvsShared Memory - 流程:IDEA 配置 → 復(fù)制參數(shù) → 遠(yuǎn)程啟動(dòng) → IDEA 連接
- 問(wèn)題排查:連接失敗、斷點(diǎn)無(wú)效、性能問(wèn)題
- 安全實(shí)踐:最小化暴露、臨時(shí)開(kāi)啟、IP 限制
核心口訣:
“先配 IDEA,再改遠(yuǎn)程;
參數(shù)復(fù)制,端口一致;
源碼同步,防火墻通;
調(diào)試完成,立即關(guān)閉。”
您提出的問(wèn)題非常精準(zhǔn)且極具實(shí)戰(zhàn)價(jià)值,這正是許多開(kāi)發(fā)者在使用遠(yuǎn)程調(diào)試時(shí)容易混淆的關(guān)鍵點(diǎn)。為了進(jìn)一步提升本教程的完整性、深度和實(shí)用性,我將在原有內(nèi)容基礎(chǔ)上,新增一個(gè)“深度問(wèn)答(FAQ)”章節(jié),系統(tǒng)性地解答您提到的問(wèn)題,并補(bǔ)充更多高級(jí)、易錯(cuò)、原理性的常見(jiàn)疑問(wèn)。
十、深度問(wèn)答
Q1:遠(yuǎn)程調(diào)試,到底調(diào)試的是“本地代碼”還是“遠(yuǎn)程代碼”?
A:調(diào)試的是“遠(yuǎn)程JVM的執(zhí)行”,但斷點(diǎn)映射到“本地源碼”。
- 執(zhí)行層面:所有代碼都在遠(yuǎn)程服務(wù)器的 JVM 中運(yùn)行。你的
main方法、Spring Bean、數(shù)據(jù)庫(kù)查詢,全部發(fā)生在遠(yuǎn)程機(jī)器上。 - 控制與展示層面:IntelliJ IDEA 作為調(diào)試客戶端,通過(guò) JDWP 協(xié)議向遠(yuǎn)程 JVM 發(fā)送指令(如“在某類某行設(shè)置斷點(diǎn)”),并接收返回的變量值、調(diào)用棧等信息。
- 斷點(diǎn)映射:IDEA 會(huì)根據(jù)你設(shè)置的斷點(diǎn),將本地源碼的文件名和行號(hào)發(fā)送給遠(yuǎn)程 JVM。遠(yuǎn)程 JVM 會(huì)查找對(duì)應(yīng)的類,并在編譯后的字節(jié)碼行號(hào)上設(shè)置斷點(diǎn)。
? 本質(zhì):你是在本地看,但遠(yuǎn)程在跑。IDEA 是“遙控器”,遠(yuǎn)程 JVM 是“電視機(jī)”。
Q2:如果我在本地設(shè)置了斷點(diǎn)并暫停了程序,遠(yuǎn)程服務(wù)器上的服務(wù)還會(huì)繼續(xù)執(zhí)行嗎?
A:不會(huì)。程序在遠(yuǎn)程 JVM 中被“凍結(jié)”了。
- 當(dāng)斷點(diǎn)被觸發(fā)時(shí),遠(yuǎn)程 JVM 的對(duì)應(yīng)線程會(huì)暫停執(zhí)行。
- 這意味著:
- 該請(qǐng)求的處理被阻塞。
- 數(shù)據(jù)庫(kù)連接可能保持打開(kāi)。
- 其他線程(如定時(shí)任務(wù)、其他請(qǐng)求)可能仍在運(yùn)行(除非是全局鎖或死鎖)。
- 影響范圍:如果是 Web 應(yīng)用,其他用戶的請(qǐng)求可能正常處理,但觸發(fā)斷點(diǎn)的這個(gè)請(qǐng)求會(huì)“卡住”,直到你點(diǎn)擊
Resume(繼續(xù))或Stop(停止)。
風(fēng)險(xiǎn)提示:在高并發(fā)場(chǎng)景下,長(zhǎng)時(shí)間暫??赡軐?dǎo)致:
- 客戶端超時(shí)。
- 線程池耗盡。
- 數(shù)據(jù)庫(kù)連接泄露。
務(wù)必避免在生產(chǎn)環(huán)境長(zhǎng)時(shí)間暫停!
Q3:斷點(diǎn)是基于“代碼內(nèi)容”還是“行號(hào)”?如果本地和遠(yuǎn)程代碼不一致,會(huì)發(fā)生什么?
A:斷點(diǎn)是基于“類名 + 行號(hào)”定位的,與代碼內(nèi)容無(wú)關(guān)。如果代碼不一致,斷點(diǎn)可能失效或錯(cuò)位。
定位機(jī)制:
- IDEA 發(fā)送指令:“在
com.example.UserService.java的第16行設(shè)置斷點(diǎn)”。 - 遠(yuǎn)程 JVM 查找
UserService類對(duì)應(yīng)的.class文件。 - JVM 根據(jù)
.class文件中的行號(hào)表(Line Number Table),將第 16 行映射到字節(jié)碼中的具體位置。 - 如果映射成功,斷點(diǎn)生效;如果行號(hào)不存在或類未加載,斷點(diǎn)顯示為“未驗(yàn)證”(Unverified)。
代碼不一致的后果:
場(chǎng)景結(jié)果本地第16行是 user.save(),遠(yuǎn)程第16行是 log.info()斷點(diǎn)會(huì)停在 log.info(),你可能誤以為停在了 save()本地有第16行,遠(yuǎn)程只有15行(代碼刪了)斷點(diǎn)“未驗(yàn)證”,永遠(yuǎn)不會(huì)觸發(fā)本地第16行是空行或注釋斷點(diǎn)無(wú)法設(shè)置,IDEA 會(huì)自動(dòng)調(diào)整到最近的有效代碼行
? 核心原則:必須確保本地源碼與遠(yuǎn)程部署的 .class 文件完全對(duì)應(yīng)。推薦使用:
- Git Commit ID 作為構(gòu)建標(biāo)簽。
- CI/CD 流水線自動(dòng)打包并記錄版本。
- 使用 jdeprscan 或反編譯工具驗(yàn)證 class 文件。
Q4:遠(yuǎn)程調(diào)試會(huì)影響遠(yuǎn)程服務(wù)器的性能嗎?
A:會(huì),但通常影響較小,除非高頻觸發(fā)斷點(diǎn)。
- 連接階段:建立連接時(shí)有輕微網(wǎng)絡(luò)和 CPU 開(kāi)銷(xiāo)。
- 運(yùn)行階段:
- JVM 需要維護(hù)調(diào)試信息(如局部變量表、行號(hào)表),占用少量?jī)?nèi)存。
- 每次方法調(diào)用、異常拋出等事件,JVM 都可能向調(diào)試器發(fā)送通知(可配置)。
- 斷點(diǎn)觸發(fā)時(shí):
- 線程暫停,該請(qǐng)求的處理完全停止。
- 如果斷點(diǎn)在循環(huán)或高頻方法中,性能影響顯著。
- 大量斷點(diǎn)可能導(dǎo)致 JVM 變慢。
? 建議:
- 僅在排查問(wèn)題時(shí)開(kāi)啟。
- 避免在生產(chǎn)環(huán)境長(zhǎng)期開(kāi)啟。
- 使用條件斷點(diǎn)減少中斷次數(shù)。
Q5:suspend=n 和 suspend=y 有什么區(qū)別?什么時(shí)候用 y?
A:
suspend=n:JVM 啟動(dòng)后不暫停,應(yīng)用正常運(yùn)行,等待調(diào)試器連接。suspend=y:JVM 啟動(dòng)后立即暫停,直到調(diào)試器連接后才開(kāi)始執(zhí)行main方法。
使用場(chǎng)景:
suspend=n:絕大多數(shù)情況,應(yīng)用可以正常啟動(dòng),你隨時(shí)連接調(diào)試。suspend=y:僅用于調(diào)試應(yīng)用啟動(dòng)過(guò)程,例如:- Spring 容器初始化報(bào)錯(cuò)。
- 靜態(tài)代碼塊執(zhí)行異常。
@PostConstruct方法問(wèn)題。
?? 警告:在生產(chǎn)環(huán)境使用 suspend=y 會(huì)導(dǎo)致應(yīng)用“假死”,必須立即連接調(diào)試器,否則服務(wù)不可用。
Q6:為什么有時(shí)候斷點(diǎn)是灰色的,顯示“Unverified breakpoint”?
A:“Unverified breakpoint” 表示 IDEA 無(wú)法確認(rèn)該斷點(diǎn)能在遠(yuǎn)程 JVM 中生效。
常見(jiàn)原因:
- 類尚未加載:應(yīng)用剛啟動(dòng),目標(biāo)類還未被 JVM 加載。連接后,類加載時(shí)斷點(diǎn)會(huì)自動(dòng)變?yōu)榧t色。
- 源碼與 class 文件不匹配:行號(hào)或類名對(duì)不上。
- 遠(yuǎn)程 JVM 未開(kāi)啟調(diào)試或端口錯(cuò)誤:根本連不上。
- 斷點(diǎn)位置無(wú)效:空行、注釋、非執(zhí)行代碼。
解決方法:
- 確認(rèn)已成功連接遠(yuǎn)程 JVM。
- 檢查源碼一致性。
- 嘗試觸發(fā)相關(guān)代碼,促使類加載。
Q7:能否同時(shí)調(diào)試多個(gè)遠(yuǎn)程 JVM?
A:可以,但需要不同的端口和配置。
- 每個(gè)遠(yuǎn)程 JVM 必須監(jiān)聽(tīng)不同的調(diào)試端口(如 5005、5006)。
- 在 IDEA 中創(chuàng)建多個(gè) Remote Debug 配置,分別對(duì)應(yīng)不同 Host:Port。
- 可以同時(shí)啟動(dòng)多個(gè)調(diào)試會(huì)話,IDEA 會(huì)用不同窗口或標(biāo)簽頁(yè)區(qū)分。
? 適用于微服務(wù)架構(gòu),同時(shí)調(diào)試多個(gè)服務(wù)。
Q8:遠(yuǎn)程調(diào)試能修改變量值嗎?安全嗎?
A:可以,但極度危險(xiǎn),僅用于調(diào)試。
- 在
Debug窗口的Variables面板中,右鍵變量 →Set Value。 - 可以修改基本類型、對(duì)象引用等。
- 風(fēng)險(xiǎn):
- 可能導(dǎo)致程序狀態(tài)不一致。
- 引發(fā)后續(xù)邏輯錯(cuò)誤。
- 在生產(chǎn)環(huán)境可能導(dǎo)致數(shù)據(jù)污染。
? 建議:僅在測(cè)試環(huán)境用于快速驗(yàn)證邏輯,禁止在生產(chǎn)環(huán)境使用。
Q9:調(diào)試時(shí),本地和遠(yuǎn)程的 JDK 版本必須一致嗎?
A:建議一致,但允許小版本差異。
- 主版本必須相同(如都是 JDK 8 或 JDK 17)。
- 次版本(如 8u292 vs 8u302)通常兼容。
- 字節(jié)碼格式、調(diào)試信息格式必須匹配。
? 最佳實(shí)踐:開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境使用相同 JDK 版本。
Q10:有沒(méi)有比遠(yuǎn)程調(diào)試更安全的替代方案?
A:有,優(yōu)先級(jí)如下:
- 日志(Logging):最安全,通過(guò)
log.info("user={}", user)輸出關(guān)鍵信息。 - APM 工具:如 SkyWalking、Pinpoint、Arthas,可動(dòng)態(tài) trace 方法調(diào)用,無(wú)需重啟。
- Arthas(阿爾薩斯):阿里開(kāi)源的 Java 診斷工具,支持在線 debug、trace、watch,強(qiáng)烈推薦替代遠(yuǎn)程調(diào)試。
- 遠(yuǎn)程調(diào)試:作為最后手段,僅在復(fù)雜邏輯無(wú)法通過(guò)日志復(fù)現(xiàn)時(shí)使用。
? 建議:能用日志解決的,不用 Arthas;能用 Arthas 的,不用遠(yuǎn)程調(diào)試。
一句話原則:
“遠(yuǎn)程調(diào)試不是常態(tài),而是應(yīng)急手段。能不連,就不連;能快連快斷,絕不長(zhǎng)連。”
以上就是IntelliJ IDEA進(jìn)行遠(yuǎn)程調(diào)試(Remote Debugging)的操作教程的詳細(xì)內(nèi)容,更多關(guān)于IDEA遠(yuǎn)程調(diào)試Remote Debugging的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何將springboot項(xiàng)目導(dǎo)出成war包
這篇文章主要介紹了詳解如何將springboot項(xiàng)目導(dǎo)出成war包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
關(guān)于Spring Bean實(shí)例過(guò)程中使用反射和遞歸處理的Bean屬性填充問(wèn)題
本文帶領(lǐng)大家一起學(xué)習(xí)下在Spring Bean實(shí)例過(guò)程中如何使用反射和遞歸處理的Bean屬性填充,需要在類 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加補(bǔ)全屬性方法,具體操作方法跟隨小編一起學(xué)習(xí)下吧2021-06-06
SpringBoot中的錯(cuò)誤處理機(jī)制源碼解析
這篇文章主要介紹了SpringBoot中的錯(cuò)誤處理機(jī)制源碼解析,springboot根據(jù)訪問(wèn)者的request中的Accept屬性來(lái)判斷要返回什么樣的數(shù)據(jù),SpringBoot存在一個(gè)錯(cuò)誤處理機(jī)制,會(huì)根據(jù)不同請(qǐng)求返回不同的結(jié)果,需要的朋友可以參考下2023-12-12
Java?Web應(yīng)用小案例之實(shí)現(xiàn)用戶登錄功能全過(guò)程
在Java開(kāi)發(fā)過(guò)程中實(shí)現(xiàn)用戶的注冊(cè)功能是最基本的,這篇文章主要給大家介紹了關(guān)于Java?Web應(yīng)用小案例之實(shí)現(xiàn)用戶登錄功能的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
SpringBoot靜態(tài)資源與首頁(yè)配置實(shí)現(xiàn)原理深入分析
最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁(yè)”問(wèn)題,通過(guò)查資料對(duì)SpringBoot訪問(wèn)靜態(tài)資源做了總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10

