![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5iYmlzNhljZzkzMzEjYzgjYjFTM1ETOwUzMyEmMwQDOm9CX1EzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.gif)
1. 前言
今天線上出現了個 Bug ,而且比較坑的是涉及到微信相關的東西不能線下調試。傳統方式是在代碼中各種的日志 log 埋點然後重新部署進行調試,再根據 log 中的資訊進行分析。如果你的 log 埋點不合理,就要不停的修改代碼、不停的打包部署。有沒有什麼騷操作避免上面的問題呢?
2. 遠端調試
當然有解決方案,這就是遠端調試(Remote debugging)。遠端調試使開發人員能夠直接診斷伺服器或其它線上程序上的問題,它提供了跟蹤線上運作時錯誤并确定性能瓶頸和問題根源的方法,讓你能夠像在本地調試一樣 Debug 遠端伺服器。接下來我們将使用流行的 Java IDE,由 JetBrains 出品的 IntelliJ IDEA 來進行遠端調試。要讓遠端伺服器運作的代碼支援遠端調試,則啟動的時候必須加上特定的 JVM 參數,這些參數是:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}
其中
debug_port
是服務端開放的調試端口,後續本地配置會用到。
3. 使用 IDEA 進行遠端調試
IntelliJ IDEA 進行遠端調試并不複雜經過下面幾個步驟就可以很友善的配置。
3.1 本地參數配置
按照上面圖的位置打開配置面闆建立一個 Remote 調試面闆如下:
按照上圖所示的順序結合你自己伺服器和本地環境依次進行配置,然後點選确定就行了。其中步驟 2 和 4 端口就是我們遠端指定的
debug_port
端口号。
3.2 JDWP 協定
這裡有一個小小的知識點就是 參數中的
jdwp
。那麼什麼是
jdwp
?
JDWP 是 Java Debug Wire Protocol 的縮寫,它定義了調試器(debugger)和目标虛拟機(target vm)之間的通信協定。Target vm 中運作着我們要調試的 Java 程式,它與一般運作的 JVM 沒有什麼差別,隻是在啟動時加載了 JDWP Agent 進而具備了調試功能。而 debugger 就是我們本地的調試器,它向運作中的 target vm 發送指令來擷取 target vm 運作時的狀态和控制遠端 Java 程式的執行。Debugger 和 target vm 分别在各自的程序中運作,他們之間通過 JDWP 通信協定進行通信。
3.3 開啟遠端調試
點選箭頭所示的 綠色甲蟲按鈕 (快捷鍵 Shift + F9) 就啟動調試了,然後設定好本地代碼的斷點,讓遠端的邏輯觸發斷點邏輯就可以進行打斷點調試了。
請務必保證本地 debug 的代碼與遠端部署的代碼完全一緻,不能發生任何的修改!否則斷點将無法命中!
4. 一些要點
除了需要保證代碼一緻外,這裡還有一些需要我們注意的地方。調試完畢遠端的 JDWP Agent 應該被禁用,也就是将遠端的相關參數去掉。另外在調試中遠端的日志并不會映射到本地,當然你可以借助一些工具将遠端的日志映射到本地以提供更強大的調試功能。
還要記住,雖然遠端調試是一個非常強大的工具,但是它并非銀彈!生産環境不是調試的合适目标,請勿濫用!
5. 總結
正如我在本文中介紹的那樣,使用 IntelliJ IDEA 進行遠端調試非常簡單,隻需幾個步驟即可使用。有些情況下它很友善地解決了我們的問題。但是它不應該被濫用,應該被合理地使用。