1. 程式人生 > 其它 >Python學習日記(十五)

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

,host為遠端程式碼執行的機器的ip/hostname,port為上一步指定的debug_port,本例是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的程式碼必須與遠端部署的程式碼完全一致,不能發生任何的修改,否則打上的斷點將無法命中,切記切記。