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

87

Je sais que nous pouvons utiliser plusieurs commandes pour accéder et lire la mémoire: 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)?

morceaux
la source
écrire une chaîne en mémoire: stackoverflow.com/questions/19503057/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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 .

Nikolai Fetissov
la source
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é.

Andrew Edgecombe
la source
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 .

João Portela
la source