2017-03-21 16 views
1

マルチスレッドアプリケーションでクラッシュしましたが、何らかの理由でスタックが部分的に解消される前に例外をキャッチできません。gdbキャッチがスローされてから例外が無視される

今私はgdbと接続してcatch throwを使用してキャッチしようとしています。しかし、私は他の無関係な、捕らえられた例外をたくさん得ています。どのように私はそれらを無視することができますか?

私はignore 1 1000000を試しましたが、これは現在注目されている例外だけを無視するのではなく、すべてのcatch throw例外を無視します。

どのように私はその特定のものだけを無視することができますか?例えば多分ファイルと行番号で?

+0

C++ 11を使用している場合、 'std :: packaged_task'の使い方を学び、次に' std :: future'を取得する必要があります。そのタスクからすべての例外をメインスレッドに転送します。あなたのスレッドは例外的なものでなければなりません。 'std :: future'はこの問題をエレガントに解決します。 –

答えて

0

バージョン7.9以降、gdbには$_caller_is$_any_caller_isなどの便利機能がいくつか含まれています。これらはブレークポイントの条件として使用して、特定のコールスタックが見つかった場合にのみ停止させることができます。

あなたは例外がスローされたスポットを知っているのであれば、たとえば、あなたのような何かを行うことができます:あなたが投げる機能を知っていれば

(gdb) catch throw if $_any_caller_is("functionname") 

しかし、それはそれはだろうと私には思えますその特定の場所にブレークポイントを設定するほうが簡単ですthrow

状況によっては、タイプ別に例外をフィルタリングするオプションもあります。この機能はバージョン7.7からcatch throwに組み込まれています。この形式は、型名に一致する正規表現を受け入れます:

(gdb) catch throw NameOfType 
関連する問題