2010-07-22 18 views
62

Sé que podemos usar varios comandos para acceder y leer la memoria: por ejemplo, imprimir, p, x ...¿Cómo modificar los contenidos de la memoria usando GDB?

Pero ¿cómo puedo cambiar el contenido de la memoria en cualquier ubicación específica (mientras se depura en GDB) ?

+0

escribir una cadena en la memoria: http://stackoverflow.com/questions/19503057/in-gdb-how-can-i-write-a-string-to-memory –

Respuesta

87

La forma más fácil es establecer una variable de programa (ver GDB: assignment):

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

o simplemente puede actualizar arbitraria (grabable) ubicación por dirección:

(gdb) set {int}0x83040 = 4 

Hay más. Lee the manual.

+4

Necesito establecer una variable de programa ANTES acceder a ubicaciones de memoria arbitraria? ¿No puedo simplemente ejecutar el segundo comando de configuración de inmediato? – Spidey

+4

Sí, puede ejecutar el segundo comando sin el primero. –

25

Como Nikolai ha dicho que puede usar el comando gdb 'set' para cambiar el valor de una variable.

También puede usar el comando 'set' para cambiar las ubicaciones de la memoria. por ej. Ampliando el ejemplo 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 

Esto debería funcionar para cualquier puntero válido, y se puede convertir a cualquier tipo de datos adecuado.

10

Ampliando las respuestas proporcionadas aquí.

Puede simplemente hacer set idx = 1 para establecer una variable, pero esa sintaxis no se recomienda porque el nombre de la variable puede entrar en conflicto con un conjunto de subcomandos. Como ejemplo, set w=1 no sería válido.

Esto significa que debe preferir la sintaxis: set variable idx = 1 o set var idx = 1.

Por último, pero no menos importante, puede usar su antiguo comando de impresión, ya que evalúa una expresión. La única diferencia es que también imprime el resultado de la expresión.

(gdb) p idx = 1 
$1 = 1 

Puedes leer más sobre gdb here.

Cuestiones relacionadas