2010-12-08 2 views
2

私はSWIGでラップしたC++コードが大量にあり、Javaから呼び出しています。 C++のコードは、ブーストスマートポインタを自由に使用します。EclipseのSWIGラップC++コードのデバッグに関するヒント?

私のJUnitテストのいくつかは完了しましたが、クリーンアップ中にsegフォルトが発生します。スタックトレースは、オブジェクトのファイナライズのメモリエラーを示しますが、SWIGによって生成されたJNIコードで発生しており、スマートポインタ参照カウントに関連付けられているようです。

私はコードのすべての層を踏み越えることができます。これは可能ですか?この種の問題で他の人の経験を聞いても大変うれしいです。

+0

通常は、あなたが通常使っているC++デバッガからJavaプロセスを起動し、JNIコードにブレークポイントを入れることができるはずです。それはコードのすべての層を踏んでいるわけではありません... –

答えて

1

実行中のJavaコードに2つ目のネイティブコードデバッガを付けることができます。たとえば、Visual Studioでは、[デバッグ]> [添付]を使用してプロセスにアタッチできます。

SWIGはスマートポインタをサポートしていますが、Java側で明示的にそのライフタイムを管理する必要があります。 Java側でスマートポインタオブジェクトの所有権を取得した場合は、それを削除する必要があります。 Javaにはスコープ外に出るオブジェクトの一時変数がないので、各レベルの戻り値がスマートポインタであるf()。h()などの式を使用することはできません。

SWIGによって生成されたファイナライザは、ガベージコレクションが発生した場合にフェイルセーフとして削除を試みます。オブジェクトが既にC++側で削除されている場合、そのフェールセーフは有害です。

関連する問題