2012-04-23 11 views
6

Kompilując następujące z MinGW 4.6.2 (z g ++ -g -std = C++ 0x), gdb wydaje się nie chcieć złapać std::out_of_range, jeśli spróbuję catch throw. jeśli I throw ręcznie to łapie dobrze, czy robię coś nie tak?gdb nie łapie std :: out_of_range rzucone przez wektor

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

Odpowiedz

3

Jak już seeen wyjątek od std::vector::at() jest wyrzucane przez __throw_out_of_range która jest funkcją wewnątrz libstdc++.so, więc podejrzewam, że istnieje jakiś problem na MinGW, który zapobiega GDB od ustawiania catchpoint w udostępnionej biblioteki. A może Twój libstdc++ nie został zbudowany z -g.

Jeśli Twój GCC został skonfigurowany z --enable-libstdcxx-debug, będziesz mieć drugi zestaw bibliotek zbudowanych z -O0 -g, które mogą działać lepiej podczas debugowania, ale ta opcja nie jest często używana.

3

Dodaj punkt przerwania, w którym std::vector zgłasza wyjątek. W tej chwili nie ma jeszcze rozwijania stosu, więc powinieneś być w stanie wrócić do oryginalnego wyciągu.

udało mi się to osiągnąć, ale tylko w bardzo realizacji zdefiniowanej sposób:

1) Odszukaj funkcję wektora za sprawdzającego zakres w stl_vector.h:

_M_range_check(size_type __n) const 
{ 
    if (__n >= this->size()) 
      __throw_out_of_range(__N("vector::_M_range_check")); 
} 

2) Dodaj punkt przerwania do linii, gdzie wywoływana jest funkcja __throw_out_of_range(). Uwaga: Próbowałem dodać punkt przerwania według "break __throw_out_of_range", ale to nie zadziałało. Zamiast tego muszę zakodować punkt przerwania za pomocą pliku i numeru linii (break stl_vector.h:794). Możesz dodać to do swojego pliku .gdbinit, aby mieć gdb na wszystkich sprawdzonych błędach.

1

miałem ten problem z msys2/mingw64 i ustawienie tego punktu przerwania wykonane gdb przystanek gdzie wystąpił rzut:

(gdb) b std::__throw_out_of_range_fmt 

działa również z innymi wyjątkami, np aby złapać wyjątek std :: bad_function_call, użyj:

(gdb) b std::__throw_bad_function_call 
Powiązane problemy