2013-02-05 31 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 

iee他被告知變量的名字。我的問題是:

有什麼辦法告訴g++/gcc給我的擴展信息?也許甚至包括行號(不知道這是否可能,但嘿,一個人可以夢想;))。
只用於funsies我運行gdb我的程序與catch 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'得到了行號,有機會得到第二個錯誤信息(即沒有調試器的名字)? – elemakil

回答

3

點擊斷點後在gdb shell中輸入bt(backtrace)命令。這將打印堆棧跟蹤(導致錯誤的一系列函數調用)。

要獲取變量名稱,現在可以使用up命令在堆棧中向上導航,並查看每個函數中使用的變量。

+0

在移動到堆棧頂部(即多個「向上」命令)之後,這將按預期工作,打印具有錯誤代碼的行。 – elemakil

3

將斷點上std::out_of_range::out_of_range。像所有C++對象一樣,異常對象在其構造函數退出後開始其生命。

[編輯] 評論做得很清楚:問題字符串由std::out_of_range::what()產生。這是實現定義的。顯然在你的情況下,它由__FUNCTION__組成,這是一個GCC宏,它命名了當前(即投擲)函數。但是這樣的函數只知道this,即指向當前對象的指針而不是它的名字。在另一種情況下,通過其他方法檢索對象名稱,而不是std::out_of_range::what()

+0

我假定你的意思是我在執行應用程序(即命令'run')之前在'gdb'中執行'break std :: out_of_range :: out_of_range'。只有這樣才能達到與'catch throw'相同的效果,因此在達到斷點後發出'where'(如@DavidSchwartz所示)顯示行號。不過,類似於他的解決方案,這涉及到使用調試器,對吧?也就是說使用這種方法無法實現第二個錯誤信息。 – elemakil

+0

我認爲沒有簡單的方法來添加打印對象名稱的功能? – elemakil

+0

@elemakil:不,這就是要點。拋出_does_的函數知道指向該對象的'this'指針,以及它自己的函數名稱,但不知道對象名稱。 (不管哲學問題是什麼 - 無論如何 - 這通常取決於你在調用堆棧中的深度)。 – MSalters

相關問題