2012-04-23 2 views
6

Compilando quanto segue con MinGW 4.6.2 (con g ++ -g -std = C++ 0x), gdb non sembra voler intercettare lo std::out_of_range se provo catch throw. se I throw manualmente va a buon fine, sto facendo qualcosa di sbagliato?gdb che non rileva std :: out_of_range generato da vettore

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

risposta

3

Come avete seeen, l'eccezione da std::vector::at() è gettato da __throw_out_of_range che è una funzione all'interno libstdc++.so, così ho il sospetto c'è qualche problema su Mingw che impedisce a GDB di creare un Catchpoint in una libreria condivisa. O forse il tuo libstdc++ non è stato creato con -g.

Se il tuo GCC è stato configurato con --enable-libstdcxx-debug, avresti un secondo set di librerie create con -O0 -g che potrebbe funzionare meglio durante il debug, ma questa opzione non viene utilizzata spesso.

3

Aggiungere un punto di interruzione in cui std::vector genera l'eccezione. In questo momento, non si è ancora verificato lo sbobinamento, quindi dovresti essere in grado di tornare completamente all'istruzione originale.

sono stato in grado di raggiungere questo obiettivo, ma solo in un modo molto definito dall'implementazione:

1) Individuare la funzione gamma di controllo del vettore nella stl_vector.h:

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

2) Aggiungere un breakpoint alla linea in cui viene chiamato __throw_out_of_range(). Nota: ho provato ad aggiungere un breakpoint con "break __throw_out_of_range", ma questo non ha funzionato. Invece, ho bisogno di hardcode il punto di interruzione con il suo numero di file e linea (break stl_vector.h:794). È possibile aggiungere questo al file .gdbinit per avere un'interruzione di gdb su tutti i controlli dell'intervallo non riuscito.

1

ho avuto questo problema con msys2/mingw64 e l'impostazione di questa breakpoint fatto tappa gdb dove si è verificato il tiro:

(gdb) b std::__throw_out_of_range_fmt 

funziona anche con altre eccezioni, per esempio per rilevare l'eccezione std :: bad_function_call, utilizzare:

(gdb) b std::__throw_bad_function_call