¿Cómo imprimir valores de registro en GDB?

191

¿Cómo imprimo el valor de %eaxy %ebp?

(gdb) p $eax
$1 = void
ensamblar
fuente
8
Use layout regpara que gdb muestre una tabla de todos los registros de enteros y marcadores, resaltando los que cambió la instrucción anterior. Ver stackoverflow.com/tags/x86/info por ejemplo.
Peter Cordes

Respuestas:

232

info registersmuestra todos los registros; info registers eaxmuestra solo el registro eax. El comando se puede abreviar comoi r

geekosaur
fuente
Obtengo: Registro no válido '% eax' Y si solo hago "registros de información", no aparece eax. Sin embargo, estoy mirando mi ensamblaje 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 nulo.
Ruslan Yushchenko
55
La respuesta de Bridgette funciona para mí. La respuesta de geekosaur es mayormente correcta, pero debe omitir el signo%, por lo que el comando para un registro específico es info registers eax. Sin embargo, no estoy seguro de si esto es diferente para diferentes versiones de gdb.
Kevin
Estaba buscando lo mismo para lldb, así que permítanme señalar que: para lldb, el comando esregister read [eax]
holgac
Si desea mostrar los valores de registro continuamente a medida que avanza por el código que puede usar display. Por ej display $eax.
srgsanky
50

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

Esos se pueden abreviar para:

i r rip
Bridgette
fuente
37

También hay:

info all-registers

Luego puede obtener el nombre de registro que le interesa, muy útil para encontrar registros específicos de la plataforma (como NEON Q ... en ARM).

yano
fuente
3
Esto enseñó sobre registros que no sabía que existían :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
En mi máquina, este grabados eax, ecxy otros registros estándar ocultos por info registers. Probablemente esta debería ser la respuesta aceptada.
EntangledLoops
15
  • Si solo quieres comprobarlo una vez, info registers muestre los registros.
  • Si solo quiere ver un registro, por ejemplo, display $esp continúe mostrando registros esp en la línea de comando gdb.
  • Si desea ver todos los registros, layout regscontinúe mostrando registros, con el modo TUI.
liuyang1
fuente
12

Comandos Gdb :

  • i r <register_name>: imprime un único registro, por ejemplo 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: imprime todo el registro, excepto el punto flotante y el registro de vectores (xmm, ymm, zmm).
  • i r a: imprime todos los registros, incluye coma flotante y registro de vectores (xmm, ymm, zmm).
  • i r f: imprime todos los registros flotantes de FPU ( st0-7y algunos otros f*)

Otros grupos de registro además de a( all) y f( float) se pueden encontrar con:

maint print reggroups

como se documenta en: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

Consejos :

  • xmm0~ xmm15, son 128 bits, casi todas las máquinas modernas lo tienen, se lanzaron en 1999.
  • ymm0~ ymm15, son 256 bits, la nueva máquina generalmente lo tiene, se lanzaron en 2011.
  • zmm0~ zmm31, son 512 bits, la PC normal probablemente no lo tenga ( como el año 2016 ), se lanzaron en 2013 y hasta ahora se utilizan principalmente en servidores.
  • Solo se mostrará una serie de xmm / ymm / zmm, porque son los mismos registros en modo diferente. En mi máquina se muestra ymm.
Eric Wang
fuente
6

p $eax funciona a partir de GDB 7.7.1

A partir de GDB 7.7.1, el comando que ha probado funciona:

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

Esta sintaxis también se puede usar para seleccionar entre diferentes miembros de unión, por ejemplo, para registros de punto flotante ARM que pueden ser punto flotante o enteros:

p $s0.f
p $s0.u

De los documentos :

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

y :

Puede referirse al contenido del registro de la máquina, en expresiones, como variables con nombres que comienzan con '$'. Los nombres de los registros son diferentes para cada máquina; use registros de información para ver los nombres utilizados en su máquina.

Pero hasta ahora no he tenido mucha suerte con los registros de control: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Solicitud de funciones 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

ARM registros de coma flotante

Ver: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
2
Es genial poder usar registros en expresiones con esta $sintaxis.
remcycles