2011-05-11 24 views
6

sé que se puede encontrar ningún parámetro examinado un desplazamiento positivo de $ ebp usando GDB:¿Cómo se leen las variables locales con gdb?

(gdb) x/4wx $ebp 

Entonces, me gustaría ver en la 3ª y 4ª direcciones usando x/s, ya que sería la primera y segunda parámetro. ¿Qué pasa con las variables locales? ¿Cómo vería los valores con una desviación negativa de $ ebp? Además, ¿hay alguna forma de ver el valor de $ eax? Cada vez que intento imprimir el valor de $ eax usando x/s $eax, la dirección está fuera de límite o el valor es 0, lo que estoy seguro de que no es porque simplemente coloque un valor constante en el registro.

Intenté info locals pero recibo el mensaje "No hay información de tabla de símbolos disponible".

Respuesta

6

Primero necesita compilar la depuración de los símbolos en su binario. Usa la opción -g en gcc con tu comando actual para hacer esto. Si está utilizando un compilador diferente, deberá consultar su documentación. Después de esto, 'info locals' y el comando de impresión funcionarán.

Para ver cualquier variable local, todo lo que necesita hacer es utilizar el comando 'imprimir'. Por ejemplo, para ver la variable local 'i' es tan fácil como 'imprimir i'.

Debería poder manejar $ eax de la misma manera que $ ebp. Sospecho que tienes problemas porque estás usando x/s. x/s intentará e imprimirá una cadena, y así continuará hasta que golpee un carácter nulo. Si esto no ocurre durante mucho tiempo, la longitud de la cadena saldrá de los límites. Pruebe con 'x/d $ eax'. Incluso puede hacer 'print $ eax'. También puede usar 'registros de información' para obtener todos los datos de registro.

0

sé que se puede encontrar ningún parámetro examinado un desplazamiento positivo de $ ebp usando GDB

Esto sólo funciona para algunos procesadores y algunas convenciones de llamada, y es de ninguna manera universal.

Suponiendo que solo le importa x86, y que su código está compilado con punteros de marco (que solía ser el predeterminado, pero ya no es el predeterminado para GCC 4.6 en modo opt), los locales se asignan a un desplazamiento negativo fijo desde %ebp.

Obviamente si puede reconstruir su código con símbolos de depuración (con -g), entonces GDB podrá simplemente imprimir sus valores, y no es necesario que le importe cómo los encuentra GDB.

Si no puede (por ejemplo, porque el código provino de un tercero), tendrá que observar cuidadosamente el desmontaje y adivinar. Si adivina que algún valor se almacena en %ebp-8, puede examinar ese valor con GDB exactamente de la misma manera que examina las compensaciones positivas: (gdb) x/wx $ebp-8.

Cuidado: el compilador es libre de diseñar local de la forma que quiere, por lo que si se declara

int x, y, z; 

el compilador es libre para almacenar x en %ebp-16, y en %ebp-20 y z en %ebp-12.

Cuestiones relacionadas