numpy C语言源代码调试(一)

近期学习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图形界面调试器的使用,待续。

原文地址:https://www.cnblogs.com/zhaoyipeng/p/numpy_c_debug.html