2012-03-27 7 views
3

Ich habe ein C++ - Programm in eine dynamische Bibliothek kompiliert, die ich jetzt in Python über Ctypes aufrufen. Allerdings bekomme ich folgende Fehlermeldung:Wie zu debuggen - Python CTypes verursachen * glibc entdeckt *

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

Wie kann ich herausfinden, ob dies ein Fehler in dem C++ Code oder in, wie ich bin mit ctypes?

Die C++ - Bibliothek läuft erfolgreich, wenn es mit einem C-Programm verknüpft ist, oder wenn ich es als eigenständiges Programm kompiliere. Wenn mit ctypes kombiniert stürzt immer an dieser C++ Linie:

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

Python-Code, der fehlschlägt:

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 

Aus irgendeinem Grund kann ich das Python-Programm erhalten erfolgreich zu arbeiten, wenn ich die Dinge ändern sich herum wie so:

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 

Allerdings, wenn ich das Hinzufügen Dinge zu der obigen Funktion zu starten (was ich tun muss), es wird mir andere glibc Fehler geben.


Hier Informationen darüber, wie ich die C++ kompiliert, falls es relevant ist.

-Header der Funktion Ich rufe, mit extern "C" scheint, wie man zu sein C erhalten ++ Code arbeiten mit ctypes:

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

g ++ Befehle:

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

Der Python-Code sieht korrekt aus. Warum ruft 'getPitchString' 'free'? –

+0

getPitchString ruft eine Menge Code innerhalb der C++ - Bibliothek auf. –

Antwort

2

Stellt sich heraus, es war ein Fehler im C++ - Teil des Codes. Ich habe es geschafft, diesen Teil unabhängig von Python/CTypes zu segfault zu bekommen, und nach dem Debuggen scheint es zu funktionieren.