Pycharm 下遠端除錯 Neutron 簡介
實驗背景及環境介紹
眾所周知要深入學習一款開源軟體就去閱讀它的原始碼吧,但如果只是閱讀冷冰冰的程式碼,往往是一頭霧水,你肯定希望知道程式碼執行起來的上下文、變數值的變化,那麼你需要除錯。對於 Openstack 來說,大多程式碼都是開源 Python 編寫的,這對於學習來說成本低很多,因為你可以隨時修改它的程式碼,重啟下程序你的程式碼就開始運行了。即使這樣,對於除錯 Openstack 這樣大型的軟體還是一件困難的事,以前我除錯有用過列印日誌、pdb 加斷點的方法,但效率都不高,直到我們組來了個新員工,新員工還是比較活躍的、比較創新的,經他介紹 Pycharm 是支援遠端除錯的。看到他給我的演示,確實是個很不錯的除錯方法,這裡簡單介紹下該種方法供大家參考。
簡單介紹下我的實驗環境:
- 本地機器:作業系統 macOS Sierra,IP地址 192.168.11.100,安裝了 Pycharm Professional 4
- 遠端機器:作業系統 CentOS 7.2, IP地址 192.168.11.115,採用 RDO 部署了 Openstack O 版本
下面是詳細的操作步驟:
建立本地工程
此步主要完成原生代碼與遠端程式碼的同步,可以將遠端程式碼下載到本地,也可以將本地在 Pycharm 中修改的程式碼很快部署到遠端環境中。
1) 開啟 Pycharm,新建一個空的工程,如工程名為 remote_neutron。 2) 依次點選【Tools】->【Deployment】->【Configuration…】彈出配置視窗,按照下面步驟進行配置。
- 點選左上角的”+”新增一個部署工程,輸入名稱和選擇連線的協議:
- 在【Connection】下填寫需要連線的遠端機器的基本資訊,如 ssh 登陸的 IP:port、賬戶密碼,填完之後點選【Test SFTP connection…】按鈕進行測試:
- 在【Mappings】下需要填寫本地目錄到遠端機器的目錄對映關係,如這裡填寫的本工程目錄對映到遠端機器的 neutron 的 Python 安裝目錄:
3) 從遠端機器下載 neutron 程式碼到本地工程, 依次點選【Tools】->【Deployment】->【Download from neutron_remote】,Pycharm 下面的狀態列中會顯示下載的狀態。
Python 遠端除錯配置
下面需要配置遠端偵錯程式,原理如下:Python 遠端除錯模型其實是一個典型的Server/Client模型。Pycharm 運行了一個 Debug Server,監聽本地的某個埠,等待 Client 的接入;遠端機器執行的 Python 程式呼叫 pycharm-debug 提供的 pydevd 庫,連線到服務端。這樣,本地主機就可以使用 PyCharm 除錯遠端主機執行的Python程式了,除錯的方法與直接除錯本地Python程式一樣。如下圖所示:
配置步驟如下:
4) 依次點選【Run】->【Edit Configurations…】彈出對話方塊,進行遠端偵錯程式的配置。
- 點選左上角的”+”號按鈕新增一個“Python Remote Debug”,配置偵錯程式的資訊,需要填寫名字、本機的IP地址及埠:
- 再點選【Path mappings】配置本地與遠端目錄的對映關係,左下角”+”號按鈕新增一個對映關係,這地方要配置正確,方便後面除錯時原生代碼可以和遠端程式碼對應上:
5) 遠端作為除錯的 Client 端,需要使用到 pydev 庫,該庫可以從本地 Pycharm 的安裝目錄下拷過去,如果是 Python2 的話是 pycharm-debug.egg
,Python3
的話對應的是 pycharm-debug-py3k.egg
。
6) 拷貝到遠端機器之後,使用命令 easy_install
pycharm-debug.egg
來安裝該 Python 庫,這樣就可以使用 pydevd 庫了。
開始除錯
一切就緒之後,終於可以開始除錯了。
7) 除錯之前需要修改引用 eventlet 的程式碼,否則斷點會有問題。對於 Neutron 專案來說,eventlet 引用有個統一的入口,在 common/eventlet_utils.py
檔案中,將 eventlet.monkey_patch()
修改為 eventlet.monkey_patch(all=False,
socket=True, time=True, thread=False)
。在 Pycharm 中修改完成之後,需要在該視窗右鍵點選【Upload to remote_neutron】,將修改的內容同步上傳到遠端的環境中。
8) 這裡舉個除錯的例子,我想跟蹤 Neutron 檢視網路的程式碼裸機,那麼在 plugins/ml2/plugin.py
檔案中修改 get_network
函式,新增如下的兩行,同樣修改完成後右鍵上傳到遠端的環境中。
import pydevd
pydevd.settrace('192.168.11.100', port=12345, stdoutToServer=True, stderrToServer=True)
9) 點選【Run】->【Debug】選擇你建立的遠端Debug Server的名字,會彈出如下的內容,表示等待客戶端連線進來。
10) 在前面修改了 Neutron 的程式碼並且上傳到環境中,但修改的程式碼不能立馬生效的,需要重啟遠端環境中 neutron-server 服務,才能使修改的程式碼生效。在遠端機器上執行命令 service
neutron-server.service restart
,等待 Neutron 服務重啟完成。
11) 在遠端機器中執行 Neutron 命令檢視某一個網路的資訊,如 neutron
net-show public
,當執行到 get_network
函式時會中斷,此時在
Pycharm 中會列印呼叫棧,接下來你可以像平時除錯本地程式一樣除錯遠端執行的 Neutron 程式碼了。
參考資料
- https://www.jetbrains.com/help/pycharm/remote-debugging.html
- http://dasheyuan.com/post/pycharm-remote-debugging/