web-dev-qa-db-fra.com

Comment modifier le contenu de la mémoire à l'aide de GDB?

Je sais que nous pouvons utiliser plusieurs commandes pour accéder à la mémoire et la lire: par exemple, print, p, x ...

Mais comment puis-je modifier le contenu de la mémoire à un emplacement spécifique (lors du débogage dans GDB)?

73
bits

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 un emplacement arbitraire (accessible en écriture) par adresse:

(gdb) set {int}0x83040 = 4

Il y a plus. Lire le manuel .

104
Nikolai Fetissov

Comme Nikolai l’a dit, vous pouvez utiliser la commande "set" de gdb pour modifier la valeur d’une variable.

Vous pouvez également utiliser la commande 'set' pour modifier les emplacements de mémoire. par exemple. En développant 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é.

25
Andrew Edgecombe

Développer les réponses fournies ici.

Vous pouvez juste faire set idx = 1 pour dé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. Par exemple set w=1 _ ne serait pas valide.

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

Dernier point mais non le moindre, vous pouvez simplement utiliser votre ancienne commande digne de confiance, car elle évalue une expression. La seule différence est qu'il imprime également le résultat de l'expression.

(gdb) p idx = 1
$1 = 1

Vous pouvez en savoir plus sur gdb here .

13
João Portela