1

Java アプリケーション用の C++ dll を作成しました。アプリケーションを個別に起動すると、アプリケーション内で dll が動作します。これには、正しい引数をすべて取得するための非常に長いバッチ ファイルが含まれます。Visual Studio 2010 で作成した dll をデバッグしてみたいと思います。Visual Studio のデバッグ プロパティ ページにコマンド ラインと引数を入力してみました。アプリケーションを正しく起動することはできませんが。

アプリケーションを起動するコマンド ラインは、アプリケーションが ApplicationName... であると仮定すると、次のようになります。

   start "ApplicationName" "C:\AppDirectory\jre\bin\javaw" -D sun.java2d.nodraw=true -Xms24m -Xmx128m -classpath "C:\AppDirectory\classes\;C:\AppDirectory\classes\iText.jar" ApplicationName

これのデバッグ設定をプロパティ設定する方法についてのアイデアはありますか? これに関するドキュメントをどこで見つけることができるかについてのアイデアはありますか?

4

2 に答える 2

1

私は次のことを強く検討します。

  1. 可能であれば、作業を行うコードが JNI について何も認識しないように JNI を構成します。ネイティブ C++ のものだけを引数として受け取り、ネイティブ C++ のものを戻り値として返し、JNIEnv 関数を呼び出さないようにします。
  2. Java クラスのネイティブ メソッドの実際の実装を持つシム レイヤーを用意します。shim レイヤーは、JNIEnv 関数を呼び出してパラメーターを抽出し、それらをネイティブ C++ オブジェクトに変換して、作業コードに渡す方法を認識します。同様に、このレイヤーは、C++ オブジェクトを Java オブジェクトに戻す方法を認識します。たとえば、ワーカー関数が を返す場合std::string、シム レイヤーは JNIEnv 関数を呼び出して、ネイティブ メソッドが JavaStringを JVM に返す方法を認識します。

常にこのように構造化できるとは限らないことは理解していますが、それにはいくつかの優れた利点があります。

  1. ワーカー コードを直接駆動する C++ プログラムを作成できます。これにより、コードをテストしたい方法で使用する状態に Java アプリを操作する必要がなくなり、コードのテストがはるかに迅速かつ簡単になります。
  2. valgrindツールで JVM 全体を実行しなくても、デバッガー、メモリ プロファイラーなどでコードだけを実行できます。これにより、JVM 内部操作によって引き起こされる「ノイズ」に圧倒されることなく、どのメモリがリークされているか、バッファ オーバーランなどを特定することがはるかに簡単になります。

このアプローチは、シム レイヤーがテストされていないことを意味します。しかし、shim レイヤーは Java の世界と C++ の世界の間でオブジェクトを変換するだけなので、非常に単純であり、完全な Java アプリのコンテキストでテストするのに適していることを願っています。

于 2012-05-13T22:14:45.150 に答える
0

私のアプリケーションでは、起動時にコマンド ライン オプションをチェックし、コマンド ライン オプションが渡された場合は DebugBreak を呼び出すロジックを追加しました。

これを行ったのは、アプリケーションが非常に複雑なスクリプトで呼び出されることが多く、スクリプトによって設定された正しい環境 (パス、環境変数、一時ファイルなど) を使用してデバッガーからアプリケーションを起動することが非常に困難または不可能な場合があるためです。 .

そのため、特定のコマンド ライン オプションが DLL に渡された場合は、単純に DebugBreak を呼び出します ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms679297%28v=vs.85%29.aspxを参照)。 .

ブレークポイントがオフになると、JIT デバッガーは、デバッガーを起動またはアタッチできるポップアップを表示します。

于 2012-05-13T21:27:39.730 に答える