Ich weiß, dass wir verschiedene Befehle verwenden können, um auf den Speicher zuzugreifen und ihn zu lesen: zum Beispiel print, p, x ...
Aber wie kann ich den Speicherinhalt an einem bestimmten Ort ändern (während des Debuggens in GDB)?
Ich weiß, dass wir verschiedene Befehle verwenden können, um auf den Speicher zuzugreifen und ihn zu lesen: zum Beispiel print, p, x ...
Aber wie kann ich den Speicherinhalt an einem bestimmten Ort ändern (während des Debuggens in GDB)?
Antworten:
Am einfachsten ist es, eine Programmvariable festzulegen (siehe GDB: Zuordnung ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Oder Sie können einfach einen beliebigen (beschreibbaren) Speicherort nach Adresse aktualisieren:
(gdb) set {int}0x83040 = 4
Es gibt mehr. Lesen Sie das Handbuch .
Wie Nikolai gesagt hat, können Sie den Befehl gdb 'set' verwenden, um den Wert einer Variablen zu ändern.
Sie können auch den Befehl 'set' verwenden, um die Speicherorte zu ändern. z.B. Das Beispiel von Nikolai erweitern:
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
Dies sollte für jeden gültigen Zeiger funktionieren und kann in einen beliebigen geeigneten Datentyp umgewandelt werden.
Erweitern Sie die hier gegebenen Antworten.
Sie können nur set idx = 1
eine Variable festlegen, diese Syntax wird jedoch nicht empfohlen, da der Variablenname möglicherweise mit einem Unterbefehl set kollidiert. Als Beispiel set w=1
wäre nicht gültig.
Dies bedeutet, dass Sie die Syntax bevorzugen sollten: set variable idx = 1
oder set var idx = 1
.
Zu guter Letzt können Sie einfach Ihren vertrauenswürdigen alten Druckbefehl verwenden, da er einen Ausdruck auswertet. Der einzige Unterschied besteht darin, dass er auch das Ergebnis des Ausdrucks druckt.
(gdb) p idx = 1
$1 = 1
Mehr über gdb können Sie hier lesen .