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

numpy C语言源代码调试(一)的更多相关文章

  1. numpy C语言源代码调试(二)

    前一篇已经介绍,可以使用gdb进行调试,但是本人不太习惯gdb的文本界面,所以希望找一个比较好用的gdb的前端gui调试器. 想到的第一个是一个非常老的调试工具,DDD. DDD - Data Dis ...

  2. numpy C语言源代码调试(三)

    鉴于ddd过于简陋,希望找一个新一些的调试工具,看到有很多人推荐gdbgui,这是一个非常新的调试工具,前端使用浏览器,现在采用这一架构的软件越来越多,可以完全不必依赖庞大的gui类库,安装使用比较方 ...

  3. C语言入门(21)——使用DBG对C语言进行调试

    C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...

  4. 让你发布的nuget包支持源代码调试

    前情概要 在不久的从前(也还是要以年为单位哈), 我们如果需要调试第三方代码, 或者框架代码很麻烦. 需要配置symbols, 匹配原始代码路径等. 为此, MS推出了 Source Link 功能, ...

  5. windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境

    windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境   http://rongmayisheng.com/post/windows%E4%B8%8B%E7%94%A ...

  6. 利用ASP.NET MVC源代码调试你的应用程序[转]

    由于项目需要,最近学起asp.net mvc.昨天遇到ViewData和TempData他们之间的分别这样让我纠结的问题.有园友强烈建议我去看ASP.NET MVC的源代码.所以,我想到如何在调试AS ...

  7. Arcgis Runtime 100.3开发实例源代码调试日志

    Arcgis Runtime 100.3开发实例源代码调试日志 路径: "D:\arcgis runtime1003\arcgis-runtime-samples-dotnet-master ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试

    最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...

  9. C语言源代码——计算任何一天是星期几

    代码写的不严谨. 网上也有很多计算任何一天是星期几的C语言源代码,不过,有些代码含有一点点小错误.像闰年的分辨啊,或者是每个月的天数,再或者星期的计算公式,都是比较细微的环节,出一点错误都有可能导致结 ...

随机推荐

  1. asp.net core ABP模板本地化设置

    ABP的语言本地化设置非常方便,甚至地区图标ABP框架都已经有了. 先看看结果吧. 英文的界面 中文的界面 配置流程如下: 首先在Localization目录下新建一个对应的json文件,里面存放对应 ...

  2. Java Web Without SSM(前言)

    是的,Spring,Mybaties确实给我们带来了方便的轻量级JavaWeb开发,但是,对于大部分中小系统来说,分层,框架,规范,已经成为一种累赘.实际的程序开发过程中,大部分时间都花在了" ...

  3. 浅谈面试中的OOD面向对象设计问题

    转载自:http://baozitraining.org/blog/Object-oriented-design-question/ OO设计问题是电面或者onsite中常考的问题,尤其对以Java为 ...

  4. 循环中else的用法

    name = 'hello' for x in name: print(x) if x == 'l': break #退出for循环 else: print("==for循环过程中,如果没有 ...

  5. 2014金山笔试_编写一个数组类 MyVector

    //编写一个数组类 MyVector,数组内容可以动态扩充,实现构造,析构,赋值操作符重载,插入,删除,获取元素个数,获取数组容量(不可以使用STL等的容器类,不能使用 //不连续的存储空间) #in ...

  6. Python 内置的一些高效率函数用法

    1.  filter(function,sequence) 将sequence中的每个元素,依次传进function函数(可以自定义,返回的结果是True或者False)筛选,返回符合条件的元素,重组 ...

  7. 【转】Sentry介绍

    Sentry 是一个开源的实时错误报告工具,支持 web 前后端.移动应用以及游戏,支持 Python.OC.Java.Go.Node.Django.RoR 等主流编程语言和框架 ,还提供了 GitH ...

  8. http://www.runoob.com/lua/lua-basic-syntax.html

    Lua优点及特性 Lua 是一个小巧的脚本语言. 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行.Lua并没 ...

  9. 3.python元类编程

     1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法.在python中他们对应的分别是属性self.xxx和类方法.但有时我们需要的属性需要根据 ...

  10. javascript中的"x != x"

    在javascript的运用中,经常遇到判断两个 对象/值 是否相等的情况.有些表明上看着一样,其实他们不一样.有些特殊情况,需要我们辨别. 引用类型 他们都是引用类型,存储的空间将从堆中分配.变量处 ...