[Numpy-discussion] PyArray_SimpleNewFromData segfaults

Ondrej Certik ondrej at certik.cz
Mon Oct 5 21:40:46 EDT 2009


Hi,

I am getting a segfault in PyArray_SimpleNewFromData in Cython. I am
trying to debug it for the last 4 hours, but still absolutely no clue,
so I am posting it here, maybe someone knows where the problem is:

cdef ndarray array_double_c2numpy(double *A, int len):
    from numpy import empty
    print "got len:", len
    cdef npy_intp dims[10]
    cdef double X[500]
    print "1"
    dims[0] = 3
    print "2x"
    print dims[0], len
    print X[0], X[1], X[2]
    cdef npy_intp size
    cdef ndarray newarr
    cdef double *arrsource

    size = 10
    arrsource = <double *>malloc(sizeof(double) * size)
    print "still alive"
    newarr = PyArray_SimpleNewFromData(1, &size, 12,
                <void *>arrsource)
    print "I am already dead. :("
    print "3"
    return empty([len])



Essential is just the line:

    newarr = PyArray_SimpleNewFromData(1, &size, 12,
                <void *>arrsource)

Then I removed all numpy from my computer, downloaded the latest git
repository from:

http://projects.scipy.org/git/numpy.git

applied the following patch:

diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors
index 3fdded0..777563c 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -1318,6 +1318,7 @@ PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr
                      intp *dims, intp *strides, void *data,
                      int flags, PyObject *obj)
 {
+    printf("entering PyArray_NewFromDescr\n");
     PyArrayObject *self;
     int i;
     size_t sd;
@@ -1553,6 +1554,7 @@ PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int
 {
     PyArray_Descr *descr;
     PyObject *new;
+    printf("entering PyArray_New, still kicking\n");

     descr = PyArray_DescrFromType(type_num);
     if (descr == NULL) {



then installed with:

python setup.py install --home=~/usr

and run my cython program. Here is the output:

$ ./schroedinger

-------------------------------------------
   This is Hermes1D - a free ODE solver
 based on the hp-FEM and Newton's method,
   developed by the hp-FEM group at UNR
  and distributed under the BSD license.
 For more details visit http://hpfem.org/.
-------------------------------------------
Importing hermes1d
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_New, still kicking
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_New, still kicking
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
entering PyArray_NewFromDescr
Python initialized
got len: 39601
1
2x
3 39601
0.0 0.0 0.0
still alive
Segmentation fault



What puzzles me is that there is no debugging print statement just
before the segfault. So like if the PyArray_New was not being called.
But looking into numpy/core/include/numpy/ndarrayobject.h, line 1359:

#define PyArray_SimpleNewFromData(nd, dims, typenum, data)                    \
        PyArray_New(&PyArray_Type, nd, dims, typenum, NULL,                   \
                    data, 0, NPY_CARRAY, NULL)


It should be called. Does it segfault in the printf() statement above?
Hm. I also tried gdb, but it doesn't step into
PyArray_SimpleNewFromData  (in the C file), not sure why.

So both print statements and gdb failed to bring me to the cause,
pretty sad day for me. I am going home now and start with a fresh
head, it just can't segfault like this... I guess I'll start by
creating a simple cython project to reproduce it (the schroedinger
code above is quite involved, it starts a python interpreter inside a
C++ program, etc. etc.).


Ondrej



More information about the NumPy-Discussion mailing list