10

Compiling the following with MinGW 4.6.2 (with g++ -g -std=c++0x), gdb doesn't seem to want catch the std::out_of_range if I try catch throw. if I throw it manually it catches fine, am I doing something wrong?

#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

ご覧のとおり、からの例外std::vector::at()がスローされます__throw_out_of_range。これは内部の関数ですlibstdc++.so。したがって、Mingwに問題があり、GDBが共有ライブラリにキャッチポイントを設定できないのではないかと思います。または、libstdc++で構築されていない可能性があります-g

GCCがで構成されている場合は、デバッグ時にうまく機能する可能性--enable-libstdcxx-debugのある2番目のライブラリセットが構築されますが、そのオプションはあまり使用されません。-O0 -g

于 2012-08-28T08:26:02.440 に答える
2

gdbで実際に例外をキャッチしているわけではありません。catch catch例外をキャッチしてみてください。

于 2012-04-23T08:10:43.020 に答える