Python學習日記(十五)
前言
對於分散式系統的除錯不知道大家有什麼好的方法。對於我來說,在知道遠端除錯這個方法之前就是在程式碼中打各種log,然後重新部署,上線,除錯,這樣比較費時,有什麼更好的辦法呢?
有時候,本地除錯的時候沒有問題,打包部署到測試環境的時候卻爆出一堆莫名其妙的問題,這時該怎麼辦呢?
偶然間瞭解到的遠端除錯的功能簡直是一把利器,能夠非常好地解決上述問題,還不趕緊來了解一下?
原理
node zendvm jvm 都有開放除錯介面,遠端斷點就是利用了這個特性。
遠端除錯
使用特定JVM引數執行服務端程式碼
要讓遠端伺服器執行的程式碼支援遠端除錯,則啟動的時候必須加上特定的JVM引數,這些引數是:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}
其中的${debug_port}
是使用者自定義的,為debug埠,本例以5555
埠為例。
本人在這裡踩過一個坑,必須要說一下。在使用公司內部的自動化部署平臺NDP進行應用部署時,該平臺號稱支援遠端除錯,只需要在某個配置頁面配置一下除錯埠號(沒有填寫任何IP相關的資訊),並且重新發布一下應用即可。事實上也可以發現,上述JVM引數中唯一可變的就是${debug_port}
。但是實際在本地連線時發現卻始終連不上5555 的除錯埠,仔細排查才發現,下面截取了NDP釋出的應用所有JVM引數列表中與遠端除錯相關的JVM啟動引數如下:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=127.0.0.1:5555
將address設定為127.0.0.1:5555
,表示將除錯埠限制為本地訪問,遠端無法訪問,這個應該是NDP平臺的一個bug,我們在自己設定JVM的啟動引數時也需要格外注意。
如果只是臨時除錯,在埠號前面不要加上限制訪問的IP地址,除錯完成之後,將上述JVM引數去除掉之後重新發佈下,防範開放遠端除錯埠可能帶來的安全風險。
本地連線遠端伺服器debug埠
開啟Intellij IDEA,在頂部靠右的地方選擇”Edit Configurations…”,進去之後點選+號,選擇”Remote”,按照下圖的只是填寫紅框內的內容,其中Name填寫名稱,這裡為remote webserver
5555
。然後點選Apply,最後點選OK即可
截圖201943017170.png
本地IDEA啟動debug模式
現在在上一步選擇”Edit Configurations…”的下拉框的位置選擇上一步建立的remote webserver
,然後點選右邊的debug
按鈕(長的像臭蟲那個),看控制檯日誌,如果出現類似“Connected to the target VM, address: ‘xx.xx.xx.xx:5555’, transport: ‘socket’”的字樣,就表示連線成功過了。我這裡實際顯示的內容如下:
Connected to the target VM, address: '10.185.0.192:15555', transport: 'socket'
設定斷點,開始除錯
遠端debug模式已經開啟,現在可以在需要除錯的程式碼中打斷點了,比如:
12.png
如圖中所示,如果斷點內有√,則表示選取的斷點正確。
現在在本地傳送一個到遠端伺服器的請求,看本地控制檯的bug介面,劃到debugger這個標籤,可以看到當前遠端服務的內部狀態(各種變數)已經全部顯示出來了,並且在剛才設定了斷點的地方,也顯示了該行的變數值。
13.png
備註:需要注意的是,用於遠端debug的程式碼必須與遠端部署的程式碼完全一致,不能發生任何的修改,否則打上的斷點將無法命中,切記切記。