2009-12-12 1 views
6

状況は次のとおりです。スレッドAは例外をキャッチし、例外のデータをメモリ内のどこかに(例外フィルタのGetExceptionInformationを使用して)保存し、その後スレッドBはその例外情報を取得して再スローします。しかし、スレッドBがキャッチされた例外をrethrowsとき、私は例外につながる元の呼び出しスタックがありません。
元のコールスタックを失うことなく例外を元に戻すにはどうすればよいですか? (この質問はC++に関するものです)。元の呼び出しスタックを失うことなく例外を再現する方法はありますか?

+0

ちょうど私がC#に特有の答えを得られなかったことを確認したかっただけです:) –

+1

解決策のいくつかは、言語/プラットフォーム固有のものです。 C++とC#の例外は異なります。また、C++の例外はプラットフォームによって異なるように実装されています。 –

+0

良い解決策はこの[スタックオーバーフロースレッド]で説明されています(http://stackoverflow.com/questions/23820633/gdb-prevent-losing-backtrace-in-a-catch-rethrow-situation) –

答えて

2

キャッチブロック内のスタックを巻き戻して、再スローする例外の一部として保存することができます。 C++でスタックを巻き戻すのはちょっと難しいですが、例としてWxWidgetsが付いたクラッシュダンプコレクタコードを見てみることができます。

+0

私のケースでは完全には実用的ではないが答えとしてマークされている –

0

質問は、スタックを「受信」スレッドに渡す必要がある理由です。

私は基本的にそれをいくつかのエラーログに報告するためにスタックが必要と仮定します。キャッチスレッドでスタックを歩いたり、ミニダンプを生成したり、収集したいエラー情報を生成したりして、受信スレッドに例外のコピーを渡すことができます(可能であればスライスに注意してください)。

+0

例外は私が一種のフォークジョインルーチンの中で捕らえたものです。そのため、あるワーカースレッドで例外がスローされた場合は、そのスレッドをメインスレッドに渡してそこに再投入したい(+元のスタックを失いたくない) –

関連する問題