Wie ändere ich den Speicherinhalt mit GDB?

85

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)?

Bits
quelle
Schreiben Sie eine Zeichenfolge in den Speicher: stackoverflow.com/questions/19503057/…
Ciro Santilli 10 冠状 病 六四 事件 10

Antworten:

120

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 .

Nikolai Fetissov
quelle
4
Ich muss eine Programmvariable setzen, bevor ich auf beliebige Speicherorte zugreifen kann. Kann ich den zweiten Befehl nicht sofort ausführen?
Spidey
29

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.

Andrew Edgecombe
quelle
16

Erweitern Sie die hier gegebenen Antworten.

Sie können nur set idx = 1eine Variable festlegen, diese Syntax wird jedoch nicht empfohlen, da der Variablenname möglicherweise mit einem Unterbefehl set kollidiert. Als Beispiel set w=1wäre nicht gültig.

Dies bedeutet, dass Sie die Syntax bevorzugen sollten: set variable idx = 1oder 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 .

João Portela
quelle