c++ - 如何调试 - 导致 *glibc 检测到的 Python CTypes*

标签 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)

最佳答案

事实证明,代码的 C++ 部分存在错误。我设法使该部分独立于 Python/CTypes 发生段错误,并且在调试之后它似乎可以正常工作。

关于c++ - 如何调试 - 导致 *glibc 检测到的 Python CTypes*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9896754/

相关文章:

C++加载文本文件,优化

c++ - 在 QImage alpha channel 中制作多边形孔

javascript - Reactjs 动态表单获取错误 OnChange 输入值?

python - 如何解决函数问题同时允许其动态化?

c# - 使用动态参数从 C# 调用 javascript 方法

ios - Swift iOS 应用程序 - 使用动态更改的行静态分配表属性

c++ - 释放分配的内存

c++ - 重载时出现堆栈溢出 >> 为类调用运算符函数。我需要做哪些改变?

python - 如何覆盖 Django Rest Framework Serializer 中的验证?

python - python中的类继承