查找抛出std :: out_of_range的对象

时间:2013-02-05 11:14:31

标签: c++ debugging exception stl

我的一个程序抛出一个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

3 个答案:

答案 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

然后在击中布雷点时运行逗号btwhere,以查看异常在代码中的位置