gdb没有捕获vector引发的std :: out_of_range

时间:2012-04-23 07:55:13

标签: c++ gdb mingw

使用MinGW 4.6.2(使用g ++ -g -std = c ++ 0x)编译以下内容时,如果我尝试std::out_of_range,gdb似乎不想捕获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 个答案:

答案 0 :(得分:3)

正如您所见,来自std::vector::at()的{​​{1}}异常是__throw_out_of_range内部的函数抛出的,所以我怀疑Mingw存在一些阻止GDB设置的问题共享库中的catchpoint。或者您的libstdc++.so未使用libstdc++构建。

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

答案 1 :(得分:3)

添加一个断点,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在所有失败的范围检查中中断。

答案 2 :(得分:2)

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

(gdb) b std::__throw_out_of_range_fmt

它也适用于其他例外,例如要捕获std :: bad_function_call异常,请使用:

(gdb) b std::__throw_bad_function_call

答案 3 :(得分:0)

你实际上并没有在gdb中捕获异常。试试catch catchcatch exception