2011-03-25 23 views
124

¿Cómo imprimo el valor de %eax y %ebp?¿Cómo imprimir valores de registro en GDB?

(gdb) p $eax 
$1 = void 
+2

Utilice 'layout reg' para que gdb muestre una tabla de todos los registros de entero y de bandera, resaltando los que hayan cambiado con las instrucciones anteriores. Ver http://stackoverflow.com/tags/x86/info por ejemplo. –

Respuesta

149

info registers muestra todos los registros; info registers eax muestra solo el registro eax. El comando se puede abreviar como i r

+0

Obtengo: Registro inválido '% eax ' Y si acabo de hacer" registros de información ", eax no aparece. Sin embargo, estoy mirando mi ensamblado de código en el IDE donde se ha generado una señal EXC_BAD_ACCESS con la instrucción: test% eax,% eax Esto está en XCode ejecutando gdb. ¿Por qué gdb no informa el registro eax? – NoahR

+1

Mismo problema:% eax está en el código, pero print $ eax muestra vacío. –

+4

La respuesta de Bridgette funciona para mí. La respuesta de geekosaur es correcta, pero debes omitir el signo%, por lo que el comando para un registro específico es 'info registers eax'. Aunque no estoy seguro de si esto es diferente para las diferentes versiones de gdb. – Kevin

37

Si está intentando imprimir un registro específico en GDB, debe omitir el signo%. Por ejemplo,

info registers eip 

Si su ejecutable es de 64 bits, los registros comienzan con r. Comenzarlos con e no es válido.

info registers rip 

Aquellos puede abreviarse como:

i r rip 
30

También hay:

info all-registers 

entonces se puede obtener el nombre del registro que está interesado en - muy útil para buscar plataforma- registros específicos (como NEON Q ... en ARM).

+3

Esto enseñó sobre los registros que no sabía que existían :-) –

+1

En mi máquina, esto imprime 'eax',' ecx', y otros registros estándar ocultos por 'info registers'. Esta debería ser probablemente la respuesta aceptada. – EntangledLoops

1

funciona como del BGF 7.7.1, el comando que ha intentado:

set $eax = 0 
p $eax 
# $1 = 0 
set $eax = 1 
p $eax 
# $2 = 1 

De the docs:

Cualquier nombre precedido por '$' se puede utilizar para una variable de conveniencia, a menos que sea uno de los nombres de registro específicos de la máquina predefinidos.

and:

Se puede hacer referencia a contenido de los registros de la máquina, en las expresiones, como variables con nombres que comienzan con ‘$’. Los nombres de los registros son diferentes para cada máquina; usa registros de información para ver los nombres usados ​​en tu máquina.

Pero no he tenido mucha suerte con los registros de control hasta el momento: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Solicitud de función 2005 https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

7
  • Si sólo desea comprobar una vez, info registers muestran los registros.
  • Si solo desea ver un registro, por ejemplo, display $esp continúe visualizando registros especiales en la línea de comandos de gdb.
  • Si desea ver todos los registros, layout regs continue show registers, con modo TUI. Comandos
5

Gdb:

  • i r <register_name>: imprimir un registro único, e.g i r rax, i r eax
  • i r <register_name_1> <register_name_2> ...: imprimir múltiples registros, por ejemplo i r rdi rsi,
  • i r: imprimir toda registro excepto de punto flotante & registro vectorial (XMM, ymm, ZMM).

  • i r a: imprimir todo el registro, incluir punto flotante & registro vectorial (xmm, ymm, zmm).

Consejos:

  • xmm0 ~ xmm15, son 128 bits, casi cada máquina moderna tiene, que son liberados en 1999.
  • ymm0 ~ ymm15, son 256 bits, nuevos máquina generalmente lo tienen, se lanzan en 2011.
  • zmm0 ~ zmm31, son 512 bits, PC normal probablemente no lo tengo (como el año 2016), se lanzan en 2013, y se utilizan principalmente en servidores hasta el momento.
  • Solo se mostrará una serie de xmm/ymm/zmm, porque son los mismos registros en modo diferente. En mi máquina se muestra ymm.
Cuestiones relacionadas