Voglio stampare l'intera lunghezza di una stringa C in GDB. Di default è abbreviato, come posso forzare GDB a stampare l'intera stringa?
Voglio stampare l'intera lunghezza di una stringa C in GDB. Di default è abbreviato, come posso forzare GDB a stampare l'intera stringa?
Risposte:
set print elements 0
set print elements
number-of-elements
Impostare un limite su quanti elementi di un array GDB stamperanno. Se GDB sta stampando un array di grandi dimensioni, interrompe la stampa dopo aver stampato il numero di elementi impostati dal set print elements
comando. Questo limite si applica anche alla visualizzazione delle stringhe. All'avvio di GDB, questo limite è impostato su 200. Impostando il numero di elementi su zero, la stampa è illimitata .
Finché il programma è in uno stato sano, puoi anche call (void)puts(your_string)
stamparlo su stdout. Lo stesso principio si applica a tutte le funzioni disponibili per il debugger, in realtà.
C'è una terza opzione: il comando x, che consente di impostare un limite diverso per il comando specifico invece di modificare un'impostazione globale. Per stampare i primi 300 caratteri di una stringa che puoi usare x/300s your_string
. L'output potrebbe essere un po 'più difficile da leggere. Ad esempio, la stampa di una query SQL comporta:
(gdb) x / 300sb stmt.c_str () 0x9cd948: "SELEZIONA article.r" ... 0x9cd958: "owid FROM articl" ... ..
x
!
Il printf
comando stamperà le stringhe complete:
(gdb) printf "%s\n", string
set print elements nnn
limite e non stamperà la stringa completa se non lo fai set print elements 0
.
Solo per completarlo:
(gdb) p (char[10]) *($ebx)
$87 = "asdfasdfe\n"
Devi dare una lunghezza, ma puoi cambiare la rappresentazione di quella stringa:
(gdb) p/x (char[10]) *($ebx)
$90 = {0x61,
0x73,
0x64,
0x66,
0x61,
0x73,
0x64,
0x66,
0x65,
0xa}
Ciò può essere utile se si desidera eseguire il debug in base ai loro valori
L'uso set elements ...
non è sempre il modo migliore. Sarebbe utile se ci fosse un distinto set string-elements ...
.
Quindi, utilizzo queste funzioni nel mio .gdbinit:
define pstr
ptype $arg0._M_dataplus._M_p
printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end
define pcstr
ptype $arg0
printf "[%d] = %s\n", strlen($arg0), $arg0
end
Avvertenze: