2012-04-23 10 views
6

MinGW 4.6.2(g ++ -g -std = C++ 0x)で次のようにコンパイルすると、をキャッチすると思われません。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()から例外がlibstdc++.so内部関数である__throw_out_of_rangeによってスローされたので、私は共有ライブラリにキャッチポイントを設定することからGDBを防ぐいるMinGW上でいくつかの問題がある疑いがされています。またはlibstdc++-gで構築されていない可能性があります。

--enable-libstdcxx-debugでGCCを設定した場合、デバッグ時にはより良い動作をするかもしれない-O0 -gで構築された2番目のライブラリセットがありますが、そのオプションは頻繁には使用されません。

0

実際にgdbで例外をキャッチしているわけではありません。試してcatch catchからcatch exceptionにしてください。あなたがseeenてきたように

3

std::vectorが例外をスローするブレークポイントを追加します。現時点では、スタックアンワインディングはまだ発生していないので、元のステートメントに完全にバックトレースすることができます。 stl_vector.hにベクトルの範囲チェック機能を探します)

1:私は、しかし、非常に実装で定義された方法で、これを達成することができました

_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 
関連する問題