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 {
7int i;
8structfile *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.
Réponses:
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 .
la source
set (str[6]) = 'c'
fonctionne, au cas où vous auriez un tableau, commechar str[]
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é.
la source
set {char[100]}(0x00) = ""
Efface 100 octets de mémoire à l'adresse 0x00Développant les réponses fournies ici.
Vous pouvez simplement
set idx = 1
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. À titre d'exempleset w=1
ne serait pas valide.Cela signifie que vous devriez préférer la syntaxe:
set variable idx = 1
ouset 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 .
la source