近期学习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. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (一)

    我们的热更新脚本在实际使用中,当然也要支持常用的第三方组件,例如这里介绍一个非常实用的第三方UI库:FairyGUI. 什么是FairyGUI 这里照搬FaiyGUI官网的介绍: 重新定义 UI 制作 ...

  2. Maven管理多模块应用

    穿越至目录: 从0开始,构建前后端分离应用 对于概念的一些理解 Maven的作用 管理模块之间的依赖:根据业务需求,系统会划分很多模块,这些模块彼此之间存在着依赖关系.比如系统管理模块依赖着文件上传模 ...

  3. 基于Spring的RPC通讯模型.

    一.概念和原理 RPC(remote procedure call),远程过程调用,是客户端应用和服务端之间的会话.在客户端,它所需要的一些功能并不在该应用的实现范围之内,所以应用要向提供这些功能的其 ...

  4. 接口调用(发送http请求)

    // 向对应的url地址发送http请求, 并获取响应的json字符串    public String getHttpResponse(String url) {        // result用 ...

  5. PAT1056:Mice and Rice

    1056. Mice and Rice (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice an ...

  6. redHat linux 修改防火墙设置简略版

    1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开启: service iptables sta ...

  7. 开源RPC(gRPC/Thrift)框架性能评测

    海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...

  8. HTML基础篇(标签和属性整--已剔除不被浏览器支持的部分)

    行内元素有:a b span img input select strong 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p HTML 参考手册- (HTML5 标 ...

  9. 远程服务器使用phantomjs报错:phantomjs unexpectedly exited. Status code was: 127

    原因是因为缺少phantomjs运行的依赖包 Ubuntu尝试: sudo apt-get install libfontconfig centos尝试: 用wget安装phantomjs依赖的lib ...

  10. HTTP状态码的详细解释,供参考

    HTTP状态码详解 常用对照表 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经 ...