7

我的一个程序抛出一个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++ 访问向量中的错误消息如下所示:

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给我扩展信息?甚至可能包括行号(不知道这是否可能,但是嘿,一个人可以梦想;))。只是为了好玩,我用这个选项
运行我的程序(我可能会补充一点,我在使用实际调试器方面的经验几乎为零)这也没有告诉我任何新的东西,事实上,它并没有告诉我错误是由于异常。 gdbcatch thrownstd::out_of_range

顺便说一句,我的编译器标志(用于调试)是:

CFLAGS = --exceptions -I$(ROOTSYS)/include --std=c++11 -Wall -g -O0 -fno-inline -fno-eliminate-unused-debug-types
4

3 回答 3

4

将断点放在std::out_of_range::out_of_range. 与所有 C++ 对象一样,异常对象在其构造函数退出后开始其生命。

[编辑] 评论说得很清楚:由std::out_of_range::what(). 这是实现定义的。显然,在您的情况下,它由__FUNCTION__GCC 宏组成,该宏命名当前(即抛出)函数。但是这样的函数只知道this,即指向当前对象的指针而不是它的名称。在另一种情况下,对象名称是通过其他方法检索的,而不是std::out_of_range::what().

于 2013-02-05T11:57:39.017 回答
4

在 gdb shell 中命中断点后输入bt(回溯)命令。这将打印堆栈跟踪(导致错误的一系列函数调用)。

要获取变量名称,您现在可以使用up命令在堆栈中向上导航,并查看每个函数中使用了哪些变量。

于 2013-02-05T13:19:24.600 回答
1

为了避免在每次抛出异常时都遇到断点,并且仅在std::out_of_range使用以下命令时停止gdb

catch throw std::out_of_range

然后运行 ​​commadbt或者where当断点被击中时,看看代码中哪里抛出了异常

于 2020-06-22T11:08:28.777 回答