zoukankan      html  css  js  c++  java
  • 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图形界面调试器的使用,待续。

  • 相关阅读:
    BZOJ 4358 坑 莫队+线段树 死T
    BZOJ 4321 DP
    两倍问题
    通宵教室
    [编程题]字符串模式匹配
    [编程题]表达式求值
    [编程题]美团骑手包裹区间分组
    1153 Decode Registration Card of PAT
    1154 Vertex Coloring
    1155 Heap Paths
  • 原文地址:https://www.cnblogs.com/zhaoyipeng/p/numpy_c_debug.html
Copyright © 2011-2022 走看看