圖文并茂教你學會使用 IntelliJ IDEA 進行遠程調(diào)試
1. 前言
今天線上出現(xiàn)了個 Bug ,而且比較坑的是涉及到微信相關(guān)的東西不能線下調(diào)試。傳統(tǒng)方式是在代碼中各種的日志 log 埋點然后重新部署進行調(diào)試,再根據(jù) log 中的信息進行分析。如果你的 log 埋點不合理,就要不停的修改代碼、不停的打包部署。有沒有什么騷操作避免上面的問題呢?
2. 遠程調(diào)試
當然有解決方案,這就是遠程調(diào)試(Remote debugging)。遠程調(diào)試使開發(fā)人員能夠直接診斷服務器或其它線上進程上的問題,它提供了跟蹤線上運行時錯誤并確定性能瓶頸和問題根源的方法,讓你能夠像在本地調(diào)試一樣 Debug 遠程服務器。接下來我們將使用流行的 Java IDE,由 JetBrains 出品的 IntelliJ IDEA 來進行遠程調(diào)試。要讓遠程服務器運行的代碼支持遠程調(diào)試,則啟動的時候必須加上特定的 JVM 參數(shù),這些參數(shù)是:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}
其中 debug_port 是服務端開放的調(diào)試端口,后續(xù)本地配置會用到。
3. 使用 IDEA 進行遠程調(diào)試
IntelliJ IDEA 進行遠程調(diào)試并不復雜經(jīng)過下面幾個步驟就可以很方便的配置。
3.1 本地參數(shù)配置

按照上面圖的位置打開配置面板新建一個 Remote 調(diào)試面板如下:

按照上圖所示的順序結(jié)合你自己服務器和本地環(huán)境依次進行配置,然后點擊確定就行了。其中步驟 2 和 4 端口就是我們遠端指定的 debug_port 端口號。
3.2 JDWP 協(xié)議
這里有一個小小的知識點就是 參數(shù)中的 jdwp 。那么什么是 jdwp?
JDWP 是 Java Debug Wire Protocol 的縮寫,它定義了調(diào)試器(debugger)和目標虛擬機(target vm)之間的通信協(xié)議。Target vm 中運行著我們要調(diào)試的 Java 程序,它與一般運行的 JVM 沒有什么區(qū)別,只是在啟動時加載了 JDWP Agent 從而具備了調(diào)試功能。而 debugger 就是我們本地的調(diào)試器,它向運行中的 target vm 發(fā)送指令來獲取 target vm 運行時的狀態(tài)和控制遠程 Java 程序的執(zhí)行。Debugger 和 target vm 分別在各自的進程中運行,他們之間通過 JDWP 通信協(xié)議進行通信。
3.3 開啟遠程調(diào)試

點擊箭頭所示的 綠色甲蟲按鈕 (快捷鍵 Shift + F9) 就啟動調(diào)試了,然后設置好本地代碼的斷點,讓遠程的邏輯觸發(fā)斷點邏輯就可以進行打斷點調(diào)試了。
請務必保證本地 debug 的代碼與遠程部署的代碼完全一致,不能發(fā)生任何的修改!否則斷點將無法命中!
4. 一些要點
除了需要保證代碼一致外,這里還有一些需要我們注意的地方。調(diào)試完畢遠程的 JDWP Agent 應該被禁用,也就是將遠端的相關(guān)參數(shù)去掉。另外在調(diào)試中遠端的日志并不會映射到本地,當然你可以借助一些工具將遠程的日志映射到本地以提供更強大的調(diào)試功能。
還要記住,雖然遠程調(diào)試是一個非常強大的工具,但是它并非銀彈!生產(chǎn)環(huán)境不是調(diào)試的合適目標,請勿濫用!
5. 總結(jié)
正如我在本文中介紹的那樣,使用 IntelliJ IDEA 進行遠程調(diào)試非常簡單,只需幾個步驟即可使用。有些情況下它很方便地解決了我們的問題。但是它不應該被濫用,應該被合理地使用。
推薦閱讀:
喜歡我可以給我設為星標哦

好文章,我?在看?

