Come faccio a stampare l'intero valore di una stringa lunga in gdb?


376

Voglio stampare l'intera lunghezza di una stringa C in GDB. Di default è abbreviato, come posso forzare GDB a stampare l'intera stringa?

Risposte:


504
set print elements 0

Dal manuale GDB :

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 elementscomando. 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 .

4
Al giorno d'oggi potresti anche aver bisogno di "impostare ripetizioni di stampa 0", altrimenti GDB ometterà elementi ripetuti della stringa / matrice.
John Lindgren,

questo vale anche per i tipi di array
Trevor Boyd Smith,

1
Potrebbe anche essere necessario "impostare il valore massimo illimitato".
AMS

100

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à.


2
Questa risposta è persino migliore di "imposta gli elementi di stampa 0" (per i miei scopi) perché rispetta i caratteri di ritorno di nuova riga / carrello invece di sfuggirli.
mhenry1384,

6
Buona soluzione, ma non funziona quando si tenta di analizzare il file di dump principale
Elalfer

Suggerimento brillante duskwuff, vorrei averlo letto prima di copiarlo e incollarlo in una chiamata printf per ottenere l'output senza caratteri di
escape

4
Nota: questa opzione funziona solo se si esegue il debug di un programma live. Non è possibile utilizzare il comando "call" di GDB durante il debug di un file core.
Solomon Slow,

1
richiede anche che gdb sia sano, il che sembra sempre più NON essere il caso (ottengo "Nessun simbolo" inserisce "nel contesto corrente" sul mio computer Mac OS X)
Michael,

39

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" ...
..

3
Mi chiedevo cosa significasse "x / 300sb". Con l'aiuto di questo cheat sheet (pdf) , ho tradotto "x / 300sb cstr" come "eXamine 300 unità (byte) di memoria all'indirizzo cstr, interpretato come una stringa (S) terminata con NULL". Se la stringa ha lunghezza 100, vedrai un sacco di immondizia, perché vengono stampati tutti i 300 byte, che abbiano un senso o meno. +1 comunque per avermi fatto conoscere x!
Rob W

39

Il printfcomando stamperà le stringhe complete:

(gdb) printf "%s\n", string

2
scusa ma questo non è vero
UmNyobe,

11
Questo sembra rispettare il set print elements nnnlimite e non stamperà la stringa completa se non lo fai set print elements 0.
Mark Lakata,

3
Quando provo questo ottengo solo: "Il valore non può essere convertito in numero intero".
Philipp Ludwig,

2
per std :: string hai bisogno di string.c_str () per evitare l'errore "Il valore non può essere convertito in numero intero"
Paul Childs

21

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


1

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:

  • Il primo dipende da c ++ lib poiché accede ai membri di std :: string, ma è facilmente regolabile.
  • Il secondo può essere utilizzato solo su un programma in esecuzione poiché chiama strlen.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.