使用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) {
}
}
答案 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 catch
到catch exception。