查找投掷对象 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++(生成的错误消息并发布在访问 Vector 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给我扩展信息吗?甚至可能包括行号(不知道这是否可能,但嘿,一个人可以梦想;)(。
只是为了好玩,我在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

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

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

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

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

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

catch throw std::out_of_range

然后在命中 breack 点时运行 commad btwhere以查看代码中引发异常的位置

相关内容

最新更新