7

私のプログラムはstd::out_of_range. その理由はわかっています-1。どこかでインデックスを持つベクトルにアクセスしています。私が知らないのは、ベクトルの名前 (変数名) とコード内の場所です。私のプログラムによって生成されたエラーメッセージは次のようになります:

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check
zsh: abort (core dumped)  ./main.x config.cfg  

一方、他の人のコード (彼も使用) によって生成され、C++ アクセス ベクトルg++の質問に投稿されたエラー メッセージは次のようになります。

Error for vec.at(i).setVec(tmp);
Error is:  terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check  

つまり、変数の名前が通知されます。私の質問は:

拡張情報を伝えるg++/提供する方法はありますか? gccたぶん、行番号を含めることもできます(それが可能かどうかはわかりませんが、男は夢を見ることができます;))。
ファンシーのためにgdbcatch thrownオプションを指定してプログラムを実行しました(実際のデバッガーを使用した経験はほとんどありません)。これは、新しいことは何も教えてくれませんでした。実際、エラーがstd::out_of_range例外 のため。

ところで、私のコンパイラ フラグ (デバッグ用) は次のとおりです。

CFLAGS = --exceptions -I$(ROOTSYS)/include --std=c++11 -Wall -g -O0 -fno-inline -fno-eliminate-unused-debug-types
4

3 に答える 3

4

にブレークポイントを設定しstd::out_of_range::out_of_rangeます。例外オブジェクトは、すべてのC ++オブジェクトと同様に、コンストラクターが終了した後に存続を開始します。

[編集]コメントはそれを明らかにしました:問題は。によって生成された文字列std::out_of_range::what()です。これは実装定義です。明らかに、あなたの場合、それ__FUNCTION__は現在の(つまりスローする)関数に名前を付けるGCCマクロから構成されています。しかし、そのような関数はthis、つまり、現在のオブジェクトへのポインタのみを認識し、その名前は認識しません。その他の場合、オブジェクト名は、ではなく、他の方法で取得されますstd::out_of_range::what()

于 2013-02-05T11:57:39.017 に答える
4

ブレークポイントをヒットした後bt、gdb シェルで (バックトレース) コマンドを入力します。これにより、スタック トレース (エラーにつながる一連の関数呼び出し) が出力されます。

変数名を取得するには、upコマンドを使用してスタック内を上に移動し、これらの各関数で使用されている変数を確認できます。

于 2013-02-05T13:19:24.600 に答える
1

例外がスローされるたびにブレーク ポイントに到達するのを回避し、次の場合にのみ停止するにstd::out_of_rangeは、次のコマンドを で使用しますgdb

catch throw std::out_of_range

次に、コマンドを実行するbtwhere、ブレークポイントがヒットしたときに、コード内のどこで例外がスローされたかを確認します

于 2020-06-22T11:08:28.777 に答える