近期學習numpy,希望了解numpy內部實現機制,嘗試調試numpy的源代碼,特別是其中的C語言源碼。
在numpy的官方網站上,有numpy的開發人員手冊:
https://docs.scipy.org/doc/numpy/dev/
通過git下載numpy的源代碼
git clone https://github.com/numpy/numpy.git
使用下面的命令之一可以進行測試
python runtests.py -v python runtests.py -v -s random python runtests.py -v -t numpy/core/tests/test_nditer.py::test_iter_c_order python runtests.py --ipython python runtests.py --python somescript.py python runtests.py --bench python runtests.py -g -m full
使用下面的命令進行編譯
python setup.py build_ext -i
調試
首先創建一個用於測試的python文件,例如mytest.py
from numpy import linspace #注意這里寫錯了 x = np.arange(5) np.empty_like(x)
運行gdb進行調試
gdb --args python runtests.py -g --python mytest.py
然后在gdb中設置斷點后運行
(gdb) break array_empty_like (gdb) run
numpy的開發人員手冊中完全是春秋筆法,多余的話一句都沒有,非常言簡意賅,但是實際成功進行調試還是很困難的,通過試驗,實現了原始gdb調試以及多種GUI前端的調試方式。
以下是具體環境和做法:
環境
調試這一類程序,我首選的是Linux,因為各種所需的軟件和運行庫,只要幾條命令就可以了。
用虛擬機安裝Ubuntu 18.04.2 64bit,該版本默認安裝了python 2.7和3.6.7,這里主要使用python 3.6.7,所以文檔里面使用python的地方需要改為python3。
為了方便軟件包的安裝,需要安裝pip3
sudo apt install python3-pip
測試
在克隆好的numpy的源代碼目錄中,執行以下命令:
python runtests.py -v
如果命令失敗,可能是缺少一些軟件包,例如cython,使用如下命令進行安裝
sudo apt install cython
gdb調試
上述步驟正確之后,可以使用官方提供的方法開始gdb的調試了,但是gdb是一個完全命令行的調試器,使用起來非常費力,我還是習慣於圖形界面的調試器。
首先創建一個用於測試的python文件,例如mytest.py,注意官方文檔寫錯了。
import numpy as np x = np.arange(5) np.empty_like(x)
運行gdb進行調試
gdb --args python runtests.py -g --python mytest.py

接下來是幾種gdb圖形界面調試器的使用,待續。