7

Google Breakpad API の使用方法を完全に誤解している可能性があります。その場合は、コメント、提案、失礼な発言を歓迎します。次の C++ 関数を呼び出そうとしています。

bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo);

私はへの参照を持っていますstd::exception:

try {
  return QApplication::notify(receiver, event);
} catch (std::exception &ex) {
  eh_.WriteMinidumpForException(?????);
  // ... do some more stuff and ultimately kill this process
}

(eh_google_breakpad::ExceptionHandlerです。)

??????には何を入れますか?

背景:これが必要な理由 (私が思うに) は、Qt がイベント ハンドラーでスローされる例外をサポートしないためです。正しく伝播されないため、例外の実際のコンテキストが失われているため、Breakpad が生成するミニダンプはまったく役に立ちません。代わりに、すべての例外をキャッチして、オーバーライドで処理する必要がありますQApplication::notify()。これは、私がやろうとしていることです。例外が発生した場合は、その例外のミニダンプをすぐに書き込んで (これは実行するようWriteMinidumpForExceptionに聞こえます)、ユーザーに通知してアプリケーションを終了します。EXCEPTION_POINTERS*しかし、パラメータとして何を渡せばよいかわかりません。

4

2 に答える 2

9

MSVC コンパイラでは、C++ 例外がネイティブの Windows 例外プラミング (SEH、構造化例外処理) にピギーバックします。ただし、かなり大きなインピーダンスの不一致があります。例外フィルターの概念は、C++ では適切に一致しません。catchハンドラーが例外をキャッチするまでに、SEH 例外は既に処理されており、スタックはアンワインドされています。EXCEPTION_POINTERS 情報はゴンゾです。例外フィルターは実際に存在します。これは、キャッチしたい特定のタイプをフィルター処理する方法ですが、コンパイラーによって自動生成されます。それらを有用にする合理的な C++ 構文は存在しません。

SEH 例外を処理するには、コンパイラのサポートを利用する必要があります。__try, __exceptキーワード (はオプション) を使用し__finallyて、フィルターで C++ 例外 0xe04d5343 ('MSC') の例外コードをキャッチします。ただし、配管がソースなしで CRT に埋め込まれている特定の C++ 例外タイプをキャッチする機能は失われます。これを修正するためにC++のtryを内部に配置して、C++ コードがフィルター処理しなかった例外のみが表示されるようにします。__try__except

SetUnhandledExceptionFilter() を使用することは、これを行う別の方法です。コードの場所に関係なく、未処理の例外の最終的なバックストップとして機能することを実際に考慮する必要があります。これは、クラッシュするアプリのミニダンプを作成するための最良の方法です。最後に、クラッシュしたアプリのミニダンプをプロセス内で作成することは、最善の方法ではありません。これがうまくいかない可能性はたくさんあります。プロセスの状態がかなりひどく破損する可能性があります。1 つの障害モードは、プロセス ヒープがロックされていることです。ヒープの損傷が非常に一般的なクラッシュの原因であることを考えると、そうではありません。「ガードプロセス」でそれを修正し、名前付きイベントを使用して、ミニダンプを作成するように通知します。例外フィルターは、常に機能するイベントを設定するだけで済みます。

于 2011-03-15T18:20:29.930 に答える
3

WindowsSEHとc++の例外は、決して絡み合っていません。これを解決する簡単な方法は、独自の__try __exceptラッピング(たとえば、nullポインターの逆参照)を使用することです。

何かのようなもの:

__try {
  * (int *) 0 = 0;
} 
__except 
    (
        eh_.WriteMinidumpForException(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER
    ) 
{
}
于 2011-03-15T17:59:19.237 に答える