1. 程式人生 > >Pycharm 下遠端除錯 Neutron 簡介

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地址及埠:

配置remote debug資訊

  • 再點選【Path mappings】配置本地與遠端目錄的對映關係,左下角”+”號按鈕新增一個對映關係,這地方要配置正確,方便後面除錯時原生代碼可以和遠端程式碼對應上:

配置remote debug資訊

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的名字,會彈出如下的內容,表示等待客戶端連線進來。

開啟 Debug

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/