2010-09-30 20 views
10

Come si chiama operator<<(std::ostream &os, const ClassX &x) dall'interno di gdb?chiamante operatore << in gdb

In altre parole, come si stampa un oggetto in gdb?

call std::cout<<x o call operator<<(std::cout, x) non sembra funzionare per me!

Qualche idea?

+0

Digito il comando 'stampa' per stampare variabili e oggetti. –

+4

Sto lavorando con una classe in cui l'operatore << fa molto in modo che l'informazione sia leggibile, quindi è un po 'fastidioso usare la stampa e avere dati grezzi. – Ben

risposta

10

L'unico modo che ho trovato è stato questo:

call 'operator<<(std::ostream&, myclass&)'(mycout, c) 

Dal std::cout non era visibile a gdb per qualche ragione, ho dovuto ricorrere a creare il mio in questo modo:

std::ostream mycout(std::cout.rdbuf()); 

È non hai indicato alcun motivo per voler farlo ma non sarà più semplice con lo print yourvariable?

Se questo è un assoluto necessario si potrebbe avere un metodo Print nella classe e chiamare che dal operator<< e quindi chiamare il metodo Print sull'oggetto da gdb.

Prendere nota che lo stdout è probabilmente memorizzato nel buffer in gdb in modo da non visualizzare alcun output a meno che non lo si reindirizzi in qualche modo.

Vedere la discussione this dall'archivio di posta di gdb relativo a questo problema.

3

È possibile anche definire una funzione come:

define printType 
call operator<<(std::ostream&, const $arg0 &)(std::cerr, $arg1) 
end 

e usarlo come:

PrintType ClassX objectOfClassX

0

Per me call operator<< correvo senza errori, ma non l'ha fatto stampare. Ho scoperto che avevo bisogno di una chiamata allo flush. Ecco una funzione utile che puoi inserire in .gdbinit:

define str 
    call (void)operator<<(std::cout, $arg0) 
    call (void)std::cout.flush() 
    printf "\n" 
end