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

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

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

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

好文章,我?在看?

