Wie ändere ich den Speicherinhalt mit GDB?


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 .


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.


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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.