2015-05-03 49 views
6

Ho cercato di eseguire il debug di un piccolo problema, e quasi sono diventato pazzo mentre cercavo di farlo. Dopo diverse ore di capire il problema, ho finalmente un frammento di codice che è la radice del mio problema:Comportamento strano di GDB

#include <iostream> 
#include <vector> 
#include <stack> 

using namespace std; 

int main() 
{ 
    std::vector<int> foo = std::vector<int>(); 

    foo.push_back(0); 
    foo.push_back(11); 
    foo.push_back(222); 
    foo.push_back(3333); 

    std::stack<int> bar = std::stack<int>(); 

    cout << endl << foo.size() << endl << endl; 

    return 0; 
} 

Con questa compilato, utilizzando:

g++ -std=c++11 -ggdb -O0 -pedantic -Wall -Wextra -Wno-nonnull -fkeep-inline-functions 

Allora provo quanto segue:

(gdb) br 18 
Breakpoint 1 at 0x40170c: file ./....cpp, line 18. 
(gdb) r 
Starting program: ... 
[New Thread 15620.0x3c3c] 

Breakpoint 1, main() at ./....cpp:18 
18    cout << endl << foo.size() << endl << endl; 
(gdb) p foo.size() 
$1 = 4293588256 
(gdb) c 
Continuing. 

4 

[Inferior 1 (process 15620) exited normally] 
(gdb) 

Apparentemente, 4 ora è uguale a 4293588256. Che diavolo sta succedendo? Inoltre, se interrompo il programma prima che venga creato lo stack, GDB mostra correttamente le dimensioni.

MODIFICA: Sono su Windows 8.1, le versioni di roba sono: G ++ 4.8.1; GDB 7.6.1

+0

Quale sistema operativo? Quale compilatore e versione? Quale versione di 'gdb'? –

+0

Impossibile riprodurre con gcc4.9.2/gdb 7.8.1 (MinGW). –

+2

Hm, quindi questo potrebbe essere un bug di GDB. Lo aggiornerò all'ultima versione e riproverò. – user1982779

risposta

3

Risulta che questo è davvero un problema di GDB 7.6.1 o G ++ 4.8.1. L'aggiornamento di GDB a 7.8.1 e G ++ alla versione 4.9.2 ha risolto il problema.

+0

Accetta questa risposta come soluzione, se questo risolve il problema. – gustafbstrom

+0

@gustaf Non può ancora. Non essere invadente! –

+0

Cosa ne pensi di una nuova installazione di entrambe le versioni originali? Sembra che GDB stia leggendo i simboli dalla versione errata di libstdC++. –