linux - Python 的 C 扩展中的 SIGSEGV

标签 linux python-3.x pointers segmentation-fault python-c-extension

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

该模块毫无问题地内置到 .so 库中,并且大部分时间都运行良好。但是,有时我会收到“段错误(核心已转储)”。

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);

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

谢谢!

最佳答案

您在 xd 中分配内存来保存 XDRFILE。然后将xd移动到dummy,解析一个整数(文件句柄?)并放入xd/dummy .然后通过释放 dummy 来释放 xd。然后你调用 read_xtc(xd, ... 它将访问空闲的内存。如果你的内存分配器决定释放那个页面,你会得到一个 SIGSEGV。

free(dummy) 移动到您实际上不再需要内存的地方。

关于linux - Python 的 C 扩展中的 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44796899/

相关文章:

Python程序只获取列表中没有重复项的唯一项

python - 将另一个后缀添加到已经具有 pathlib 后缀的路径

c - 编写使用指针复制字符串的函数时出错

c - C-函数定义具有用于参数的指针,在调用时传递的变量不是指针,而是编译和运行(有时)。怎么样?

ruby - 为什么 Linux 上的 Ruby 对 File.writable 返回 true? ('/tmp/file' ) 但在尝试写入文件时引发 Errno::EACCES ?

linux - 颠覆svn+ssh,sshd 100% CPU

java - 是否可以在没有官方 oracle dmg 文件的情况下在 mac os x 上安装 JDK 7 或 8?

python - Django model.foreignKey 并返回 self.text 错误

c - 使用指针 : using a global, 按值传递哪个更快?

node.js - 带有标志 --legacy-watch 的 Nodemon 不适用于 docker Ubuntu/Linux