2012-04-23 38 views
6

用MinGW 4.6.2编译以下代码(使用g ++ -g -std = C++ 0x),gdb似乎不想要赶上std::out_of_range如果我试着catch throw。如果我throw它手动捕捉罚款,我做错了什么?gdb不捕捉std :: out_of_range被向量抛出

#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) {   
    } 
} 

回答

3

正如您所选,std::vector::at()的例外是__throw_out_of_range这是libstdc++.so中的一个函数,因此我怀疑Mingw有一些问题阻止GDB在共享库中设置一个入口点。或者,也许你的libstdc++不是用-g构建的。

如果你的GCC配置了--enable-libstdcxx-debug,你可能会有第二套使用-O0 -g构建的库,它们在调试时可能会更好,但该选项并不经常使用。

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中断。

1

我曾就此问题与msys2/mingw64和设置断点做出GDB停止扔发生其中:

(gdb) b std::__throw_out_of_range_fmt 

它也可以与其他异常,例如捕捉std :: bad_function_call异常,请使用:

(gdb) b std::__throw_bad_function_call