10

使用 MinGW 4.6.2(使用 g++ -g -std=c++0x)编译以下内容,gdb 似乎不想抓住std::out_of_rangeif I try catch throw。如果我throw手动它会很好,我做错了什么吗?

#include <stdexcept>
#include <vector>

int main()
{
    std::vector<char> vec(10);
    try {       
        vec.at(10); // this won't be caught by gdb

        // throw std::out_of_range(""); // this will
    }
    catch (std::out_of_range const& e) {        
    }   
}
4

4 回答 4

4

std::vector在引发异常的地方添加断点。此时,尚未发生堆栈展开,因此您应该能够完全回溯到原始语句。

我能够做到这一点,但只能以非常实现定义的方式:

1) 在以下位置找到向量的范围检查功能stl_vector.h

_M_range_check(size_type __n) const
{
    if (__n >= this->size())
          __throw_out_of_range(__N("vector::_M_range_check"));
}

2) 在调用 __throw_out_of_range() 的行中添加断点。 注意:我尝试通过 'break __throw_out_of_range' 添加断点,但这不起作用。相反,我需要使用文件和行号 ( break stl_vector.h:794) 对断点进行硬编码。您可以将其添加到您的.gdbinit文件中,以使 gdb 在所有失败的范围检查时中断。

于 2014-02-19T13:01:43.393 回答
3

如您所见,异常 from std::vector::at()is throw by __throw_out_of_rangewhich is a function inside libstdc++.so,所以我怀疑 Mingw 存在一些问题,阻止 GDB 在共享库中设置捕获点。或者,也许你libstdc++不是用-g.

如果您的 GCC 已配置,--enable-libstdcxx-debug您将拥有第二组构建的库-O0 -g,在调试时可能会更好地工作,但该选项不经常使用。

于 2012-08-28T08:26:02.440 回答
2

您实际上并没有在 gdb 中捕获异常。尝试catch catch捕捉异常

于 2012-04-23T08:10:43.020 回答
2

我在 msys2/mingw64 上遇到了这个问题,设置这个断点使 gdb 在发生抛出的地方停止:

(gdb) b std::__throw_out_of_range_fmt

它也适用于其他异常,例如捕获 std::bad_function_call 异常,使用这个:

(gdb) b std::__throw_bad_function_call
于 2017-05-17T07:49:47.147 回答