2012-03-27 6 views
3

私はC++プログラムを動的ライブラリにコンパイルしました。これをctypes経由でPythonで呼び出しています。しかし、私は次のエラーを取得する:これはC++コード内、または私はctypesのを使用していますどのようにエラーであればデバッグ方法 - PythonのCTypesが* glibcを検出しました*

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

は、私はどのように把握できますか?

Cプログラムでリンクされている場合、またはスタンドアロンプ​​ログラムとしてコンパイルした場合、C++ライブラリではが正常に実行されます。が実行されます。私は次のように周りのものを変更した場合、私は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 

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

Pythonコード失敗:ctypesのと組み合わせると、それは、常にこのC++ラインでクラッシュだから:上記の関数(私がする必要がある)に物事を追加し始めると、他のglibcエラーが出ます。


ここでは、関連する場合のC++のコンパイル方法について説明します。 extern "C" を使用して、私が呼んでいる関数の

ヘッダーは、C++コードはctypesので作業を取得する方法のようだ:コマンド++

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

グラム:

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

Pythonコードが正しく表示されます。 'getPitchString'が' free'を呼び出すのはなぜですか? –

+0

getPitchStringは、C++ライブラリ内から一連のコードを呼び出します。 –

答えて

2

が判明していましたコードのC++部分にエラーがあります。私はその部分をPython/CTypesとは独立してsegfaultにすることができました。そして、デバッグ後にはうまくいくようです。

関連する問題