如何调试 - 导致* glibc检测到的Python CType *

时间:2012-03-27 19:59:03

标签: c++ python dynamic ctypes glibc

我已经将一个C ++程序编译成一个动态库,我现在通过ctypes在python中调用它。但是,我收到以下错误:

*** glibc detected *** ../../bin/python: free(): invalid pointer: 0x00007fbdf8ae3500 ***

如何确定这是C ++代码中的错误,还是我如何使用ctypes?

C ++库在与C程序链接时运行成功,或者我将其编译为独立程序。当与ctypes结合使用时,它总是在这个C ++行崩溃:

// ... A bunch of code
if(tempBuffer) {
    delete[] tempBuffer;
    // More code below that never runs...

失败的Python代码:

def test(fileName):
    feedbackLib = cdll.LoadLibrary("./libpitch.so")

    # Set return type to a character pointer
    feedbackLib.getPitchString.restype = c_char_p
    feedbackLib.getPitchString.argtypes = [c_char_p]

    # Crashes Here!
    feedbackStr = feedbackLib.getPitchString(fileName)
    return feedbackStr

出于某种原因,如果我像这样改变一切,我可以让python程序成功运行:

def test(fileName):
    # I've only changed this line
    feedbackLib = CDLL("./libpitch.so")

    # Set return type to a character pointer
    feedbackLib.getPitchString.restype = c_char_p
    feedbackLib.getPitchString.argtypes = [c_char_p]

    # No longer crashes!
    feedbackStr = feedbackLib.getPitchString(fileName)
    return feedbackStr 

但是,如果我开始向上面的函数添加内容(我需要这样做),它会给我其他的glibc错误。


以下是有关我如何编译C ++的信息,以防它相关。

我正在调用的函数头,使用extern“C”似乎是如何让C ++代码与CTypes一起工作:

extern "C" char* getPitchString(char* filename);

g ++命令:

$(CXX) $(LDFLAGS) -fPIC -c $(SRCS) $(LIBS)
$(CXX) -shared -Wl,-soname,libpitch.so -o libpitch.so $(OBJS) $(LIBS)

1 个答案:

答案 0 :(得分:2)

原来,代码的C ++部分出错了。我设法将这部分独立于Python / CType的segfault,并在调试后似乎工作。