Wie drucke ich den vollen Wert einer langen Zeichenfolge in gdb?

376

Ich möchte die gesamte Länge eines C-Strings in GDB drucken. Standardmäßig wird es abgekürzt. Wie kann ich GDB zwingen, die gesamte Zeichenfolge zu drucken?

John Carter
quelle

Antworten:

504
set print elements 0

Aus dem GDB-Handbuch :

set print elements number-of-elements
Legen Sie eine Grenze für die Anzahl der Elemente eines Arrays fest, die GDB drucken soll. Wenn GDB ein großes Array druckt, wird der Druckvorgang beendet, nachdem die vom set print elementsBefehl festgelegte Anzahl von Elementen gedruckt wurde . Diese Grenze gilt auch für die Anzeige von Zeichenfolgen. Wenn GDB gestartet wird, wird diese Grenze auf 200 festgelegt. Wenn Sie die Anzahl der Elemente auf Null setzen, ist der Druck unbegrenzt .
John Carter
quelle
4
Heutzutage benötigen Sie möglicherweise auch "set print repeats 0", andernfalls lässt GDB wiederholte Elemente der Zeichenfolge / des Arrays weg.
John Lindgren
Dies gilt auch für Array-Typen
Trevor Boyd Smith
1
Möglicherweise müssen Sie auch "Maximalwert unbegrenzt festlegen".
Ams
100

Solange sich Ihr Programm in einem vernünftigen Zustand befindet, können Sie call (void)puts(your_string)es auch auf stdout drucken. Das gleiche Prinzip gilt tatsächlich für alle Funktionen, die dem Debugger zur Verfügung stehen.

Dämmerung -inaktiv-
quelle
2
Diese Antwort ist sogar besser als "Druckelemente auf 0 setzen" (für meine Zwecke), da sie die Zeichen für Zeilenumbruch / Wagenrücklauf berücksichtigt, anstatt sie zu maskieren.
Mhenry1384
6
Gute Lösung, funktioniert aber nicht, wenn versucht wird, die Core-Dump-Datei zu analysieren
Elalfer,
Genialer Vorschlag duskwuff, ich wünschte, ich hätte das gelesen, bevor ich es kopiert und in einen printf-Aufruf eingefügt habe, um die nicht entflohene Ausgabe zu erhalten ..: D
nevelis
4
Hinweis: Diese Option funktioniert nur, wenn Sie ein Live-Programm debuggen. Sie können den GDB-Befehl "call" nicht verwenden, wenn Sie eine Kerndatei debuggen.
Solomon Slow
1
Außerdem muss gdb vernünftig sein, was zunehmend NICHT der Fall zu sein scheint (ich bekomme "Kein Symbol" setzt "in den aktuellen Kontext" auf meinem Mac OS X-Computer)
Michael
39

Es gibt eine dritte Option: den Befehl x, mit dem Sie einen anderen Grenzwert für den jeweiligen Befehl festlegen können, anstatt eine globale Einstellung zu ändern. Zum Drucken der ersten 300 Zeichen einer Zeichenfolge können Sie x/300s your_string. Die Ausgabe ist möglicherweise etwas schwerer zu lesen. Das Drucken einer SQL-Abfrage führt beispielsweise zu:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "SELECT article.r" ...
0x9cd958: "owid FROM articlel" ...
..
Wichert Akkerman
quelle
3
Ich habe mich gefragt, was "x / 300sb" bedeutet. Mit Hilfe dieses Spickzettel (pdf) habe ich "x / 300sb cstr" als "eXamine 300 Einheiten (Bytes) Speicher an der Adresse cstr übersetzt, interpretiert als NULL-terminierte Zeichenfolge (S)". Wenn Ihre Zeichenfolge die Länge 100 hat, werden Sie viel Müll sehen, da alle 300 Bytes gedruckt werden, unabhängig davon, ob sie sinnvoll sind oder nicht. +1 trotzdem für die Vorstellung x!
Rob W
39

Der printfBefehl gibt die vollständigen Zeichenfolgen aus:

(gdb) printf "%s\n", string
korry
quelle
2
Entschuldigung, aber das ist nicht wahr
UmNyobe
11
Dies scheint die set print elements nnnGrenze zu respektieren und druckt nicht die vollständige Zeichenfolge, es sei denn, Sie tun dies set print elements 0.
Mark Lakata
3
Wenn ich das versuche, bekomme ich nur: "Wert kann nicht in Ganzzahl konvertiert werden."
Philipp Ludwig
2
Für std :: string benötigen Sie string.c_str (), um den Fehler "Wert kann nicht in Ganzzahl konvertiert werden" zu vermeiden
Paul Childs
21

Nur um es zu vervollständigen:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

Sie müssen eine Länge angeben, können jedoch die Darstellung dieser Zeichenfolge ändern:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

Dies kann nützlich sein, wenn Sie anhand ihrer Werte debuggen möchten

abstraktor
quelle
1

Verwenden set elements ...ist nicht immer der beste Weg. Es wäre nützlich, wenn es eine eindeutige gäbe set string-elements ....

Also benutze ich diese Funktionen in meiner .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

Vorsichtsmaßnahmen:

  • Die erste ist c ++ lib-abhängig, da sie auf Mitglieder von std :: string zugreift, kann jedoch leicht angepasst werden.
  • Die zweite kann nur für ein laufendes Programm verwendet werden, da es strlen aufruft.
mrtimdog
quelle