2012-04-27 42 views
10

BGF proporciona funcionalidad para leer o escribir en una dirección lineal específica, por ejemplo:¿Cómo usar una dirección lógica en gdb?

(gdb) x/1wx 0x080483e4 
0x80483e4 <main>:  0x83e58955 
(gdb) 

pero ¿cómo se especifica una dirección lógica? Me encontré con la siguiente instrucción:

0x0804841a <+6>:  mov %gs:0x14,%eax 

¿Cómo puedo leer la memoria en "% gs: 0x14" en GDB, o bien, traduce esta dirección lógica a una dirección lineal que podría utilizar en x mando?

nota: Yo sé que simplemente podía leer% eax después de esta instrucción, pero ese no es mi preocupación

+0

posible duplicado de [cómo resolver el segmento: direcciones de desplazamiento en GDB] (http://stackoverflow.com/questions/4006686/how-to-resolve-segmentoffset-adres-in-gdb). Sin embargo, eso no tiene una buena respuesta. – Job

Respuesta

4

¿Cómo puedo leer la memoria en "% gs: 0x14" en GDB

No se puede: no hay forma de que GDB sepa cómo se ha configurado el segmento al que se refiere %gs.

o traducir esta dirección lógica a una dirección lineal que podría utilizar en el comando x

Una vez más, no se puede hacer esto en general. Sin embargo, parece que está en Linux de 32 bits x86, y allí puede hacer eso - el %gs está configurado para apuntar al descriptor de hilo a través de la llamada al sistema set_thread_area.

Puede hacer catch syscall set_thread_area en GDB, y examinar los parámetros (cada hilo tendrá una de esas llamadas). El código para hacerlo es here. Una vez que sepa cómo se configuró %gs, simplemente agregue 0x14 al base_addr, y listo.

+0

Buena respuesta. Desafortunadamente, mi programa parece no llamar a set_thread_area (2). Puede ver el código fuente aquí: http://pastebin.com/us5sbzVg (opciones de compilación incluidas en el código fuente). – user368507

+1

@ user368507 Su programa solo tiene un hilo. El programa * does * llama a 'set_thread_area' (deberías poder ver eso bajo' strace'). Pude captar esa llamada con GDB; no estoy seguro de por qué afirma que 'set_thread_area' no se llama. –

+0

mi error. Usé otra computadora después del OP. Era un x86-64 ... Usted está trabajando perfectamente en 32 bits x86. Supongo que las cosas son diferentes en x86-64. – user368507

Cuestiones relacionadas