Ich denke, Ihr Problem hat mit der Art zu tun, wie Sie die Variable in gdb drucken. Nehmen Sie dieses einfache Programm, kompilieren als debug (-g
bei Verwendung von gcc), und laufen und brechen in der ersten puts
Aussage:
int main(void)
{
char *ptr = "str \xff";
char arr[] = "str \xff";
puts(ptr);
puts(arr);
return 0;
}
Wenn ich versuche und Druck ptr
so, wie Sie erwähnt haben, p /x ptr
, es werde drucken sie den Wert von ptr
(die Adresse es zeigt auf):
(gdb) p /x ptr
$1 = 0x4005f8
Allerdings, wenn ich für arr
den gleichen Befehl tun, ich werde:
(gdb) p /x arr
$2 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
Das liegt daran, dass gdb sehen kann, dass arr
vom Typ char[6]
und nicht char*
ist. Sie können die gleichen Ergebnisse mit dem Befehl p /x "str \xff"
, erhalten, die für die Prüfung Dinge nützlich ist:
(gdb) p /x "str \xff"
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
Jetzt, wenn Sie wollen in der Lage zu drucken Sie eine bestimmte Menge an Bytes von der Adresse hingewiesen durch ein Zeiger, verwendet, um den untersuchen (x
) Speicherbefehl anstelle von Druck (p
):
(gdb) x/6bx ptr
0x4005f8 <__dso_handle+8>: 0x73 0x74 0x72 0x20 0xff 0x00
die 6 Byte in hex gedruckt wird von der Adresse, die von ptr
spitz. Versuchen Sie das mit Ihrer buff
Variable und sehen Sie, wie Sie gehen.
Alternativ kann eine andere Sache, die Sie versuchen können, ist:
(gdb) p /x (char[6])*ptr
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
Dies wird behandeln die char
als das erste Element von ptr
wies in einer Anordnung von 6 char
s, und wird es Ihnen ermöglichen, um den Druckbefehl zu verwenden.
Dies ist nicht klar. Wie bereits in den Antworten auf die vorherigen Fragen erklärt, wird '\ xff' nicht im String gespeichert. Ein einzelnes Zeichen (dessen Wert 255 ist) wird an seiner Stelle gespeichert. –
Der Schrägstrich sollte die folgenden Zeichen nicht beeinflussen. Was _does_ gdb im Puffer anzeigen? –
Haben Sie einen Code für diesen Absatz? – DavidO