Comment modifier le contenu de la mémoire en utilisant GDB?


Réponses:


124

Le plus simple est de définir une variable de programme (voir GDB: affectation ):

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

Ou vous pouvez simplement mettre à jour l'emplacement arbitraire (inscriptible) par adresse:

(gdb) set {int}0x83040 = 4

Il y a plus. Lisez le manuel .


4
J'ai besoin de définir une variable de programme AVANT d'accéder à des emplacements de mémoire arbitraires? Ne puis-je pas simplement exécuter la deuxième commande set tout de suite?
Spidey

aussi, set (str[6]) = 'c'fonctionne, au cas où vous auriez un tableau, commechar str[]
xealits

29

Comme Nikolai l'a dit, vous pouvez utiliser la commande gdb 'set' pour changer la valeur d'une variable.

Vous pouvez également utiliser la commande «set» pour modifier les emplacements de mémoire. par exemple. Expansion sur l'exemple de Nikolai:

(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

Cela devrait fonctionner pour tout pointeur valide et peut être converti en n'importe quel type de données approprié.


set {char[100]}(0x00) = ""Efface 100 octets de mémoire à l'adresse 0x00
davenpcj

16

Développant les réponses fournies ici.

Vous pouvez simplement set idx = 1définir une variable, mais cette syntaxe n'est pas recommandée car le nom de la variable peut entrer en conflit avec une sous-commande set. À titre d'exemple set w=1ne serait pas valide.

Cela signifie que vous devriez préférer la syntaxe: set variable idx = 1ou set var idx = 1.

Enfin, vous pouvez simplement utiliser votre ancienne commande d'impression fidèle, car elle évalue une expression. La seule différence étant qu'il imprime également le résultat de l'expression.

(gdb) p idx = 1
$1 = 1

Vous pouvez en savoir plus sur gdb ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.