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?
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?
Antworten:
set print elements 0
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 elements
Befehl 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 .
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.
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" ... ..
x
!
Der printf
Befehl gibt die vollständigen Zeichenfolgen aus:
(gdb) printf "%s\n", string
set print elements nnn
Grenze zu respektieren und druckt nicht die vollständige Zeichenfolge, es sei denn, Sie tun dies set print elements 0
.
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
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: