Python ctypes的分段错误:11'

时间:2017-04-28 16:46:39

标签: python c stack heap ctypes

修改 新的示例在不更改ulimit的情况下爆炸,并且c部分中的内容无关紧要。

我是一名python用户(我从edX课程学习),我一直在使用ctypes和c(但我真的不知道c)。 当我使用一些特定的参数(基本上,一个大的数组大小)运行它时,我的代码出现“Segmentation fault:11”问题,这是一个复制我的代码所做的小例子:

test1.py:

import numpy as np
from numpy.ctypeslib import ndpointer
import ctypes as cy


Lib_Path = './lib.so'

class Simulacion:
    def __init__(self, ss,tm):
        self.tm    = tm;
        self.ss    = ss;

    def ejecutar(self):
        self.data   = np.empty((int(self.ss), self.tm), dtype = float)
        lib   = cy.CDLL(Lib_Path)
        dblc = cy.c_double; pntrc = ndpointer(dblc);  intc = cy.c_long
        lib.trisolve.argtypes = [intc, pntrc, intc]
        lib.trisolve(self.tm, self.data, self.ss)
        return self.data

ss = 10
tm  = int(1e6);

sim = Simulacion(ss,tm)
data = sim.ejecutar()

test1.c

void trisolve(int tm, double* data, int ss){

}

生成文件

SRC=test1
GCC=gcc-6
all:
    $(GCC) -fPIC -fopenmp -lm -c -O3 $(SRC).c
    $(GCC) -shared -lgomp -o lib.so $(SRC).o
clean:
    rm lib.so
    rm $(SRC).o

此代码在不更改ulimit的情况下爆炸。

对于我的真实代码,我使用的是“ulimit -s 65532”,这是我的mac中的最大堆栈大小。这限制了我正在使用的数组的大小,目前我需要复制它的大小。 对于我发现的问题,问题是数组存储在堆栈而不是堆中,所以我有这个硬限制因为SO。 所以我的问题是,如何将大数组传递给C,将其存储在堆中然后将其恢复到python?

我主要使用python,并且我在这个lenguaje中没有很好地形成代码的c部分,所以“stacks”,“heap”和可能“malloc”对我来说是新的术语。

谢谢!

1 个答案:

答案 0 :(得分:1)

最后我发现了这个与ctypes无关的问题。 在我真正的c代码中,我使用array[tm]定义了一个数组,但是tm对于堆栈来说很大。 为什么我能用上面的代码复制问题?我真的不知道,但是当我今天尝试时(因为@eryksun告诉他代码对他有用),它并没有爆炸。 谢谢您的帮助;我将来会尝试学习更多的C语言。