5

デバッグする必要のあるc++dllがあります。dllを使用している状況のため、呼び出し元のアプリケーションを介してdllをデバッグできません。

そこで、catchが例外をファイルに書き込むtry-catchを作成しました。

デバッグする必要のある行には、サードパーティのdllからインポートされたクラスが含まれているため、それがどのタイプの例外であるかを知る方法がありません。catch(例外e)を試したところ、ファイルにメッセージが書き込まれませんでした。だから私はcatch(...)を試しましたが、それは何かを引き起こしました:

std :: exception :: whatを使用すると、ファイルに書き込まれるのは「1」だけでした。std :: exception :: exceptionを使用して、ファイルは次のコードを受け取りました:"0579EF90"。

スローされた例外に関する意味のある情報を取得する方法はありますか?

TIA

CG

4

5 に答える 5

8

catch(KnownExceptionType ex)情報を抽出するためにKnownExceptionTypeに関する知識を使用および使用しない場合、できません。

あなたがあなたと一緒に捕まえるとき、catch(...)あなたはあなたが例外を処理したことを知っていますが、そこにはタイプ情報がなく、あなたができることはほとんどありません。

最悪の場合、ライブラリから例外が発生します。ライブラリのヘッダーがあったとしても、例外に関する情報はありません。その例外タイプをそこで定義する必要はありません。

于 2010-01-12T16:30:58.147 に答える
4

私があなたを正しく理解している場合、あなたはすでに問題の原因をサードパーティのライブラリへの特定の呼び出しに絞り込んでいますが、アプリケーションをライブでデバッグすることは許可されていません(理由を尋ねたいですか?)。質問は、「例外が何であるかを知らなくても、どうすれば例外をデバッグできるか」です。

答えは、できません。あなたが観察したように、あなたは盲目的に推測し、正しいものを捕まえることを望むことができます。catch(...)もできますが、それではまったく何もわかりません。ライブでデバッグできる場合は、例外がスローされたときにデバッガーを中断するように設定して、そこで何が起こっているかを確認できます。

正しい答えは、問題の原因を絞り込んだサードパーティの図書館に連絡して尋ねることだと思います。例外をスローし、モジュールの境界を越えて伝播できるようにすることは、非常に非常に悪い形式です。これは、nullポインタのderefなどに対するWindows SEHの例外であると思われます。あなたは、catch(...)がそれらをキャッチするようにコンパイルしています。

于 2010-01-12T19:10:52.610 に答える
3

たぶんstd::exception&eをキャッチしてみてください

  1. std :: cout << e.what()<< endl;
  2. それをstd::logic_errorおよびstd::runtime_errorにキャストできるかどうかを確認してください。これにより、処理している内容の手がかりが得られるはずです。
于 2010-01-12T16:34:38.573 に答える
1

私は少し混乱しています。一方では、あなたが書いcatch(std::exception)たものは機能しませんでした(あなたはcatch(const std::exception&)、BTWを使うべきです)、他方では、あなたはあなたが呼び出したものも書きますstd::exception::what()。そもそもを持っていなかった場合、どのようにこれを行いstd::exceptionましたか?

とにかく、あなたが何かを捕まえたら...、RTTI情報を記録しようとすることができます:

#include <typeinfo>

try {
  foreign_code(my_data);
} catch(const some_type& x) {
  std::cerr << "Yikes! Caught exception of type '" 
            << typeid(x).name() 
            << "' with its hand in the cookie jar!\n";
  std::abort();
}

標準では、の結果を想定していませんがstd::type_info::name()、ほとんどの(すべてではないにしても)コンパイラーは、少なくともある程度有用なものを出力するコードを生成します。

VSデバッガー内にいる場合は、スローされた例外で停止するように設定することもできます。これにより、スタックトレースが得られるため、DLLに渡されたデータが問題の原因である可能性があるかどうかについての手がかりが得られる可能性があります。

于 2010-01-12T17:06:06.917 に答える
1

まず、常にconst参照によって例外をキャッチする必要があります。つまり、次のようになります。

catch( const std::exception & ex ) {
  ...
}

そうしないと、例外がキャッチした正確なタイプになり、例外情報が失われる可能性があります。

ただし、ライブラリがstd :: exceptionから派生していないものをスローしているようです。タイプ(理想的には基本タイプ)が何であるかを確認する必要があります。

于 2010-01-12T16:56:22.380 に答える