23

私はc++例外を使い始めたばかりで、それを正しくしたいと思っています。私が念頭に置いているのは、例外がキャッチされたときに、ある種のバックトレース情報を生成することです。当初、C ++の例外については、コールスタックに似たアイデアがありましたが、最終的にはそれがあまり良くないことがわかりました。

また、gcc C ++アプリがクラッシュしたときにスタックトレースを生成する方法も読みましたが、現在のプロジェクトをさらに複雑にしたくありません。デバッグモードの場合にのみバックトレースが必要なので、その目的でgdbを使用できることを期待していました。

私の戦略は、catchブロックにブレークポイントを挿入してから、呼び出しスタックを上に移動して、例外が最初にスローされた理由(またはその原因)を正確に特定することでしたか?残念ながら、gdbがブレークポイントに到達すると、呼び出しスタックがクリアされ、mainのみが表示されるため(ここでキャッチ)、これを実行できないようです。これは起こるはずですか、それとも私はここで何か間違ったことをしていますか?

編集: 私は他の人々のためにここで方法を要約するのが好きです:

最初の方法(paulsm4による)。catch throwスローでキャッチするため、またはキャッチでキャッチするためのキャッチポイントビアを設定してくださいcatch catch!次に電話backtrace

2番目の方法(asheplerによる)ブレークポイントをオンに設定し__cxa_throwてからbacktrace

3番目の方法(Qt Creatorの場合-使用する場合)throwまたはcatchにブレークポイントを簡単に設定できます!

Edit_2: Qt Creatorデバッガーを使用すると、ブレークポイントを設定することも:)__cxa_begin_catchと同等のようです。catch catch

4

2 に答える 2

19

これこれ:

http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html

キャッチポイントを使用して、C ++例外や共有ライブラリのロードなど、特定の種類のプログラムイベントに対してデバッガーを停止させることができます。catchコマンドを使用して、キャッチポイントを設定します。

したがって、答えは「はい」である必要があり、引用した2つのリンクの問題を回避する必要があります。

役に立ったら投稿してください!個人的には、このGDB機能を自分で試したことはありません:)

于 2012-05-15T00:04:36.223 に答える
5

コメントからの回答の要約:

最初の方法(paulsm4による)。catch throwスローでキャッチするため、またはキャッチでキャッチするためのキャッチポイントビアを設定してくださいcatch catch!次に電話backtrace

2番目の方法(asheplerによる)ブレークポイントをオンに設定し__cxa_throwてからbacktrace

3番目の方法(Qt Creatorの場合-使用する場合)throwまたはcatchにブレークポイントを簡単に設定できます!

Qt Creatorデバッガーを使用すると、ブレークポイントをオンに設定すること__cxa_begin_catchも同等です。catch catch

于 2015-02-11T20:34:59.727 に答える