2012-09-05 11 views
7

スローされた例外が特定のキャッチによって処理される場合、スローサイトでC++でコアをダンプする方法はありますかブロック?例外がトップレベルに達したときにg ++で起こることに似たものが欲しいです。 FOO(の呼び出しサイトに到達した任意のFOOからの例外()またはその呼び出し先の)がコア・ダンプを引き起こす場合、例外が特定のキャッチブロックによって処理される場合、C++スローでコアをダンプする方法

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

この方法:たとえば

、私はこのような何かをしたいと思いますをスローサイトに送信すると、誰が例外をスローしてこのレベルに達したのかが分かります。

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

+1

私は普通の方法は単純にそれをキャッチしないことだと思うし、コンパイラ/環境があなたのためにダンプを行うことを願っています。スローサイトに関する情報は、 'throw'式の後に_instant_を失います。 –

+0

そう、私はスタックが解かれないようにコアダンプのロジックを生成するようにコンパイラに伝えたいのです。これは、呼び出しチェーンのルートまで* catchブロックがない場合に起こることとまったく同じだから可能です。しかし、私の場合は例外をキャッチする外部catchブロックがあります。私は非常に具体的には、例のようにfoo()のスローサイトにコアをダンプし、バーからの例外を無視したいと思います。私はclang ++またはg ++の特定の答えで暮らすことができます。 – Manish

+1

その場合、_throw site_はcatcheeではなく、コアダンプを生成する必要があります。ただし、内部構造にコア・ダンプを生成し、その情報を例外に保存し、例外をスローするオプションもあります。 _キャッチャーはそのダンプ情報で何かをすることができます。 –

答えて

2

はい、Windowsでも可能です。私はLinuxも知らないと思う。

我々はここでcatch 前の応答にthrowを例外ハンドラ関数を登録することができ、コードの例です:コードの出力である

#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 

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

Windowsが例外をどのようにディスパッチするかを理解するには、WindowsでWhat is a First Chance Exception?を知る必要があります。

関連する問題