16

未処理のC++例外が発生した場合は、次のように出力します。

  1. what()C ++例外のメッセージ( )
  2. スタックトレース。

スタックトレースを取得するために、 StackWalkerライブラリSetUnhandledExceptionFilterと組み合わせて使用​​しています。

struct FooStackWalker : StackWalker
{
    virtual void OnCallstackEntry(CallstackEntryType, CallstackEntry &entry) override
    {
        std::cerr << entry.lineFileName << " (" << entry.lineNumber << "): " << entry.undFullName << std::endl;
    }
};

LONG WINAPI UnhandledExceptionHandler(LPEXCEPTION_POINTERS pointers)
{
    FooStackWalker walker;
    walker.ShowCallstack(::GetCurrentThread(), pointers->ContextRecord);
    ::TerminateProcess(::GetCurrentProcess(), 1);
}


int main()
{
    ::SetUnhandledExceptionFilter(UnhandledExceptionHandler);
}

スタックトレースを取得して問題なく印刷できましたが、取得whatが困難になっています。

終了前にこのメンバー関数を呼び出すために、SEH例外をC ++例外としてデコードする方法はありますか?

4

2 に答える 2

4

すでに例外の詳細を提供しているC++機構を使用してみませんか?SEHフィルターで排他的ではありません(ただし、排他的SetUnhandledExceptionFilterです)。ハンドラーを正しくネストする必要があります。

int main()
{
    try {
        return cppexcept_main();
    }
    catch (const std::exception& e)
    {
        //use e.what()
    }
}

int cppexcept_main()
{
    __try {
        return application_main();
    }
    __except(GrabStackTrace(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) {
         /* never reached due to EXCEPTION_CONTINUE_SEARCH */
    }
}
于 2014-07-04T20:15:51.240 に答える
2

編集:私はあなたの質問を誤解しました。C ++例外の答えが何であるかははっきりとは言えませんが、答えは「いいえ」であると合理的に確信しています。SEHによって引き起こされた未処理の例外(アクセス違反など)とキャッチされていないC ++例外を区別する方法、または異なるタイプのC++例外を区別する方法はないと思います。馬はすでにその上に納屋を出ています。

以下の元の答え:


いいえ、SEH例外には。がないためwhatです。ではありませんstd::exceptionこのMSDNの例では、SEH例外をC ++例外としてキャッチしようとしている場合、省略記号(...catchハンドラーでのみキャッチできると述べています。SEH例外をC++例外に変換する独自の関数を定義するために使用できます_set_se_translatorが、その時点ではwhat、同じ情報から別の場所で独自の関数を生成しているだけです(それでも、それがから取得することが可能UnhandledExceptionFilterです)。

LPEXCEPTION_POINTERS構造に必要なすべての情報があります。アクセス違反が発生した場合は、(0xC0000005)pointers->ExceptionRecord->ExceptionCodeになります。それが発生した場合は、変数と変数をEXCEPTION_ACCESS_VIOLATION調べて、それが読み取りまたは書き込み違反であったかどうか、およびアクセスが試みられたアドレスを特定できます。NumberParametersExceptionInformation

于 2012-10-30T22:38:17.757 に答える