用于Python的C扩展中的SIGSEGV

时间:2017-06-28 08:05:41

标签: linux python-3.x pointers sigsegv python-c-extension

我有一个Python的C扩展模块,它使用函数_xdr_read_xtc读取xtc轨迹。

该模块内置于.so库中,没有任何问题,并且大部分时间都运行良好。但是,有时候我会得到“Segmentation fault(core dumped)”。

static PyObject * _xdr_read_xtc(PyObject *self, PyObject *args)
{
    int natoms;
    XDRFILE *xd;
    xd = (XDRFILE *) malloc(sizeof(XDRFILE));
    if (xd == NULL){
      return NULL;}

    XDRFILE *dummy;
    dummy = xd;

    if (!PyArg_ParseTuple(args, "ii", &xd, &natoms)){
        return NULL;
    }

    free(dummy);

    int step = 0;
    float time;
    float prec;
    matrix box;
    rvec *x;
    x = malloc(natoms * sizeof(*x));
    if (x == NULL){
        return NULL;}

    // read frame
    int status = read_xtc(xd, natoms, &step, &time, box, x, &prec);

    if (status == 0 | status == 11){
        npy_intp dims[2]= {natoms, 3};

        PyArrayObject *matout = (PyArrayObject *) PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, x);
        PyArray_ENABLEFLAGS(matout, NPY_ARRAY_OWNDATA);

        PyObject *Frame = Py_BuildValue("Oii", matout, status, step);
        Py_DECREF(matout);

        return Frame;
    }
    else{
        free(x);
        return  NULL;
    }
}

使用Valgrind进行调试时,我得到'进程以信号11(SIGSEGV)的默认动作终止。不在地址0x195688988'的映射区域内进行访问:

int status = read_xtc(xd, natoms, &step, &time, box, x, &prec);

代码有什么明显错误吗?一个无效的指针可能?或者它可能是内存问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

您在xd中分配内存以容纳XDRFILE。然后将xd移到dummy,解析整数(文件句柄?)并输入xd / dummy。然后,您可以通过释放xd释放dummy。然后拨打read_xtc(xd, ...,即可访问免费内存。如果你的内存分配器决定放弃那个页面,你会得到一个SIGSEGV。

free(dummy)移动到您实际不再需要内存的位置。