2013-02-05 12 views
6

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

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

(彼はあまりにもg++使用しています)と、質問C++ accessing vectorに掲載さは次のようになります。

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 

e彼は変数の名前を伝えられます。私の質問は:

g++/gcc私に詳細情報を伝える方法はありますか?たぶん、行番号を含めることもできます(それは可能かどうかわかりませんが、ちょっと男が夢見ることができます;))。
funsiesちょうど私はgdbcatch thrownオプションで私のプログラムを走らせました(実際には、実際のデバッガの使用経験はほとんどありません)。そのエラーはstd::out_of_range例外のためです。

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

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

'catch throw 'で' gdb'を実行した後で、例外が捕捉されたら、 'where'と打ちます。 –

+0

@DavidSchwartzパーフェクト!だから、私は 'gdb'から2番目のエラーメッセージ(デバッガなしの名前)を取得する行番号を取得しましたか? – elemakil

答えて

3

ブレークポイントに達すると、gdbシェルにbt(backtrace)コマンドを入力します。スタックトレース(エラーに至る一連の関数呼び出し)が出力されます。

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

+0

これは、スタックの先頭に移動した後(すなわち、複数の 'up'コマンド)、問題のあるコードの行が印刷された後、正常に動作します。 – elemakil

3

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

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

+0

私はあなたがアプリケーションを実行する前に 'gdb'で' break std :: out_of_range :: out_of_range'を実行することを意味すると思います(つまり、コマンド 'run')。これを行うだけで 'catch throw'と同じ効果が得られ、ブレークポイントに達した後(' @DavidSchwartzによって示唆されるように) 'where'が行番号を表示します。しかし、彼のソリューションと同様に、これはデバッガを使用することになります。すなわち、この方法を用いて第2のエラーメッセージを達成することはできない。 – elemakil

+0

オブジェクト名を印刷する機能を追加する簡単な方法はないと思いますか? – elemakil

+0

@elemakil:いいえ、それがポイントです。 _does_をスローする関数は、オブジェクトへの 'this'ポインタとそれ自身の関数名を知っていますが、オブジェクト名は知っていません。 (哲学的な疑問を除けば、オブジェクト名はとにかくです - 通常、コールスタックにどれくらい深いところがあるかによって決まります)。 – MSalters

関連する問題