Wie drucke ich den vollen Wert einer langen Schnur in gdb?
Frage
Ich mag die volle Länge eines C-String in GDB drucken. Standardmäßig es wird abgekürzt, wie kann ich GDB zwingen, die gesamte Zeichenfolge zu drucken?
Lösung
set print elements 0
set print elements
number-of-elements
Legen Sie ein Limit, wie viele Elemente eines Arrays GDB gedruckt wird. Wenn GDB ist ein großes Array Druck, stoppt er den Druck, nachdem er die Anzahl der Elemente festgelegt durch den Befehl set print elements
gedruckt wurde. Diese Grenze gilt auch für die Anzeige von Strings. Wenn GDB beginnt, wird diese Grenze auf 200 Einstellung number-of-Elemente auf Null bedeutet, dass der Druck unbegrenzt .
Andere Tipps
Solange Ihr Programm in einem gesunden Zustand, man kann es auch auf der Standardausgabe drucken call (void)puts(your_string)
. Gleiches Prinzip gilt für alle Funktionen zur Verfügung, um den Debugger, eigentlich.
Es gibt eine dritte Option: die x-Befehl, mit dem Sie eine andere Grenze für den spezifischen Befehl festlegen können, anstatt eine globale Einstellung zu ändern. Um die ersten 300 Zeichen einer Zeichenkette drucken Sie x/300s your_string
verwenden können. Der Ausgang könnte ein bisschen schwieriger zu lesen sein. Zum Beispiel das Drucken einer SQL-Abfrage ergibt:
(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..
Der printf
Befehl werden die kompletten Strings drucken:
(gdb) printf "%s\n", string
Just vervollständigen es:
(gdb) p (char[10]) *($ebx)
$87 = "asdfasdfe\n"
Sie müssen eine Länge geben, kann aber die Darstellung dieser Zeichenkette ä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 durch ihre Werte debuggen
set elements ...
Verwendung ist nicht immer der beste Weg. Es wäre sinnvoll, wenn es eine deutliche set string-elements ...
waren.
So verwende ich diese Funktionen in meinem .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
Caveats:
- Die erste ist c ++ lib abhängig, wie es Mitglieder von std :: string greift, wird aber leicht angepasst.
- Die zweite kann nur auf einem laufenden Programm verwendet werden, wie es Strlen nennt.