openstack調試
對於開源的openstack而言,調試顯然非常重要,在調試的過程中,我們可以跟蹤代碼的執行過程,對於我們理解openstack的結構和框架有十分重要的意義。在之前的教程中提到的使用devstack工具在虛擬機中安裝部署openstack,通常虛擬機運行會有點卡,為了不讓虛擬機那么卡,我們拋棄了較大的python IDE(pycharm和eclipse等)。使用的是最為常見的python代碼調試手段-PDB。
使用PDB調試openstack代碼只需在我們希望設置斷點的地方加上下面的兩行代碼:
import pdb
pdb.set_trace ()
然后在screen窗口中重啟相應的服務即可,代碼就會停止在這兩行代碼所在的地方,然后我們可以使用pdb提供的命令進行調試,常用的pdb命令如下所示:
s(tep) 單步調試,執行當前的行,遇到函數則進入
n(ext) 單步調試,執行到下一行。step和next的區別的step遇到函數會進入函數內部,而next直接運行到當前代碼的下一行,執行完step進入的整個函數
c(ontinue) 繼續執行,直到遇到下一個斷點,若后面沒有斷點,直接執行完整個代碼
r(eturn) 繼續執行,直到當前函數返回
pp 表達式 打印變量的值
l(ist) 查看當前行的代碼段
a(rgs) 查看當前函數的參數列表,很有用
b(reak) 設置斷點,在python程序執行過程中可以隨時設置斷點
更多的可以參考pdb的官方文檔:https://docs.python.org/2/library/pdb.html
下面我們將演示如何調試openstack/nova子項目中的keypairs.py,具體路徑在/opt/stack/nova/nova/api/openstack/compute/keypairs.py
打開keypairs.py,在2.10對應的版本(由於我的nova-compute的版本是2.10)中加入前面的兩行代碼,如下所示:
我們在196和197行上加了兩行代碼,完了之后保存一下。把/opt/stack/nova/nova/api/openstack/compute/keypairs.pyc文件備份一下,改個名稱就好了,這里我們把它改成keypairs_backup.pyc,以便以后需要時可以找回。
然后使用python的py_compile的compile方法把keypairs.py編譯一下,編譯成keypairs.pyc,因為openstack中直接使用的是pyc文件而不是py文件,這樣可以加快速度。
如下所示:
我們會發現在當前目錄下多了一個keypairs.pyc文件。
由於我們使用的是devstack安裝部署的openstack,因此可以在devstack目錄下執行 screen -x stack 打開screen窗口,不懂得可以查看我之前的教程http://www.cnblogs.com/uestcjoel/p/5987020.html
切換到n-api*窗口之后,使用ctrl+c關閉,使用向上鍵找到nova api開啟的命令(/usr/local/bin/nova-api & echo $! >/opt/stack/status/stack "/opt/stack/status/stack/n-api.failure"
),按回車等待執行就好。重啟nova api服務后,可以看到如圖所示的畫面:
為了觀看方便,我們先使用nova keypair-add keypair-d20a3d59-9433-4b79-8726-20b431d89c78創建一個名為keypair-d20a3d59-9433-4b79-8726-20b431d89c78的keypair,之后使用
nova keypair-show keypair-d20a3d59-9433-4b79-8726-20b431d89c78命令查看這個keypair。
由於我們在keypairs.py中的show中設置了斷點,因此程序會停留在被設置的斷點處,我們可以在screen窗口中看到,如下所示:
之后我們便可以像調試一般的pyhton程序一樣調試keypairs.py中的代碼,例如可以使用l查看當前代碼段:
至此,我們學習了如何在pdb中調試openstack nova代碼,具體的執行細節可以使用pdb命令s跟下去。