So che possiamo usare diversi comandi per accedere e leggere la memoria: ad esempio, print, p, x ...
Ma come posso modificare il contenuto della memoria in una posizione specifica (durante il debug in GDB)?
So che possiamo usare diversi comandi per accedere e leggere la memoria: ad esempio, print, p, x ...
Ma come posso modificare il contenuto della memoria in una posizione specifica (durante il debug in GDB)?
Risposte:
Il modo più semplice è impostare una variabile di programma (vedi GDB: assegnazione ):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Oppure puoi semplicemente aggiornare la posizione arbitraria (scrivibile) per indirizzo:
(gdb) set {int}0x83040 = 4
C'è più. Leggi il manuale .
set (str[6]) = 'c'
funziona, nel caso tu abbia un array, comechar str[]
Come ha detto Nikolai, puoi usare il comando gdb 'set' per modificare il valore di una variabile.
È inoltre possibile utilizzare il comando "set" per modificare le posizioni di memoria. per esempio. Espandendo l'esempio di 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
Questo dovrebbe funzionare per qualsiasi puntatore valido e può essere eseguito il cast a qualsiasi tipo di dati appropriato.
set {char[100]}(0x00) = ""
Cancella 100 byte di memoria all'indirizzo 0x00
Espandendo le risposte fornite qui.
Puoi semplicemente set idx = 1
impostare una variabile, ma questa sintassi non è consigliata perché il nome della variabile potrebbe essere in conflitto con un sottocomando set. Ad esempio set w=1
non sarebbe valido.
Ciò significa che dovresti preferire la sintassi: set variable idx = 1
o set var idx = 1
.
Ultimo ma non meno importante, puoi semplicemente usare il tuo fidato vecchio comando di stampa, poiché valuta un'espressione. L'unica differenza è che stampa anche il risultato dell'espressione.
(gdb) p idx = 1
$1 = 1
Puoi leggere di più su gdb qui .