我已经将一个 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/