【问题标题】:gdb not catching std::out_of_range thrown by vectorgdb 没有捕捉到向量抛出的 std::out_of_range
【发布时间】:2012-04-23 07:55:13
【问题描述】:

使用 MinGW 4.6.2(使用 g++ -g -std=c++0x)编译以下内容,如果我尝试 catch throw,gdb 似乎不想捕获 std::out_of_range。如果我手动 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) {        
    }   
}

【问题讨论】:

    标签: c++ gdb mingw


    【解决方案1】:

    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。

    【讨论】:

    • 好收获。现在在 QtCreator 中添加断点似乎可以工作了。
    • 谢谢。我在现代 gdbs (8.3) break __throw_out_of_range 中发现没有 file::line;用于 std::unordered_map。标准的catch throw std::out_of_range 仍然没有。
    【解决方案2】:

    正如您所见,__throw_out_of_range 引发了来自std::vector::at() 的异常,这是libstdc++.so 中的一个函数,所以我怀疑Mingw 上存在一些问题,阻止了GDB 在共享库中设置一个catchpoint。或者你的libstdc++ 不是用-g 构建的。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        (gdb) b std::__throw_out_of_range_fmt
        

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

        (gdb) b std::__throw_bad_function_call
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-25
          • 2021-10-14
          • 2014-03-02
          • 1970-01-01
          • 1970-01-01
          • 2013-01-20
          相关资源
          最近更新 更多