簡體   English   中英

查找拋出 std::out_of_range 的對象

[英]Find object throwing std::out_of_range

我的一個程序拋出一個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  

而由其他人(他也使用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  

即他被告知變量的名稱。 我的問題是:

有沒有辦法告訴g++ / gcc給我擴展信息? 甚至可能包括行號(不知道這是否可能,但是嘿,一個人可以做夢;))。
只是為了好玩,我在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

std::out_of_range::out_of_range上放置一個斷點。 異常對象與所有 C++ 對象一樣,在其構造函數退出后開始其生命周期。

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

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

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

為了避免在拋出的每個異常處遇到斷點並僅在std::out_of_range處停止,請在gdb使用以下命令:

catch throw std::out_of_range

然后運行commad btwhere當breack點打,看看在代碼中拋出異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM