7

スローされた例外が特定の catch ブロックによって処理される場合、C++ でスローがスロー サイトでコアをダンプするようにする方法はありますか? 例外が最上位に到達したときに g++ で発生するのと同様のことが必要です。

たとえば、次のようなものが欲しいです。

try {
  bar();
  try {
    foo();
  } catch(...) {
#  pragma dump_at_throw_site
  }
} catch(...) {
  std::cerr << "There was a problem" << std::endl;
}

このようにして、foo() またはその呼び出し先からスローされた例外が foo() の呼び出しサイトに到達すると、スロー サイトでコア ダンプが発生するため、このレベルに到達した例外を誰がスローしたかを確認できます。

一方、bar() によってスローされた例外は通常どおり処理されます。

4

1 に答える 1

2

はい、Windowsでも可能です。私はLinuxを知りません、それもできると思います。

例外ハンドラ関数を登録して、throw前に応答することができcatch ます。コード例は次のとおりです。

#include <iostream>
#include "windows.h"
#define CALL_FIRST 1
LONG WINAPI
VectoredHandler(
    struct _EXCEPTION_POINTERS *ExceptionInfo
    )
{
    UNREFERENCED_PARAMETER(ExceptionInfo);
    std::cout <<"VectoredHandler"<<std::endl;
    return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
    PVOID handler;
    handler = AddVectoredExceptionHandler(CALL_FIRST,VectoredHandler);

    try {
        throw 1;
    }catch(...)
    {
        std::cout <<"catch (...)"<< std::endl;
    }

    RemoveVectoredExceptionHandler(handler);
    std::cout << "end of main"<<std::endl;
    return 0;
}

コードの出力は次のとおりです。

VectoredHandler
catch (...)
end of main

したがって、coreintを関数にダンプできますVectoredHandler。はVectoredHandler、デバッガーが最初のチャンスの通知を受け取った後、システムがスタックの巻き戻しを開始する前に呼び出されます。また、問題の問題をデバッグすることだけが目的の場合は、デバッガー機能を使用して最初のチャンスの例外を処理できます。アプリケーションをダンプする必要はありません。

参考までに、ファーストチャンス例外とは何かを知る必要があるかもしれません。Windowsで例外をディスパッチする方法を理解するためにWindowsで。

于 2012-09-06T01:53:20.800 に答える