2016-09-25 5 views
0

私は​​でc/C++ライブラリを使用する単純なpythonスクリプトを持っています。私のC++ライブラリにもmainメソッドが含まれているので、-sharedフラグを付けずにコンパイルすることができます。これを実行すると問題なく実行できます。エラーメッセージなしでctypesをデバッグする方法

しかし、​​を使用しているPythonスクリプトから同じコードを実行すると、C++プログラムの一部が実行されます(これはcout呼び出しからわかります)。その後、pythonスクリプト、termiantesを含むアプリケーション全体(私は逃したcoutprint呼び出しからそれを伝えることができます)。 segfault、no python stacktraceというエラーメッセージはありません。

私の質問は:これをどのようにデバッグできますか?これが起こる可能性のある理由は何ですか?

ここではコードの一部ですが、エラーメッセージが表示されないため、関連するコードはわかりません。

import ctypes 

interface = ctypes.CDLL("apprunner.so") 
interface.start() 
print "complete" 

#include "../../app/ShaderApp.cpp" 
#include <iostream> 
#include "TestApp.cpp" 

TestApp* app = 0; 

extern "C" void start() { 
    app = new TestApp(); 
    cout << "Running from library" << endl; 
    app->run(); 
} 

int main(int argc, const char* argv[]) { 
    cout << "Running from excecutable" << endl; 
    start(); 
} 

答えて

0

通常、Pythonからの関数呼び出しをテストできる小さなモックアップライブラリから始めます。これが準備ができたら(すべてのデバッグプリントがOKです)、さらに進んでください。あなたの例では、#include "testapp.cpp"をコメントアウトして、coutが動作するようにプリントを入手してください。

+0

私はそれを行いました。失敗した場所は特別なことをしません(forループ)。また、同じコードはctypesから呼び出されていないときに機能します。 – Toast

+0

良いそれでは、デバッガ(gdbなど)を使う時が来ました。 C++関数にブレークポイントを設定します。残念ながら、デバッガの使用は容易ではありません。 – ddbug

+1

これは私の問題を解決しました。問題は、私はポインタの配列を使用していて、それを初期化していないということでした。 excecutableとしてコンパイルすると、配列には何らかの形でnullpointersしか含まれていませんでした。これは私のコードが正しく処理したものです。 – Toast

関連する問題