[英]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 bt
或where
當breack點打,看看在代碼中拋出異常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.