我的一个程序抛出一个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
答案 0 :(得分:4)
在std::out_of_range::out_of_range
上放置一个断点。与所有C ++对象一样,异常对象在其构造函数退出后开始生命。
[编辑]
评论明确指出:std::out_of_range::what()
产生的字符串问题。那是实现定义的。显然,在你的情况下,它由__FUNCTION__
组成,这是一个GCC宏,它命名当前(即投掷)函数。但是这样的函数只知道this
,即指向当前对象而不是其名称的指针。在另一种情况下,通过其他方法检索对象名称,而不是std::out_of_range::what()
。
答案 1 :(得分:3)
点击断点后,在gdb shell中输入bt
(backtrace)命令。这将打印堆栈跟踪(导致错误的一系列函数调用)。
要获取变量名称,您现在可以使用up
命令在堆栈中向上导航,并查看每个函数中使用的变量。
答案 2 :(得分:1)
为避免在每次抛出异常时都达到断点并仅在std::out_of_range
处停止,请在gdb
中使用以下命令:
catch throw std::out_of_range
然后在击中布雷点时运行逗号bt
或where
,以查看异常在代码中的位置