¿Cómo imprimir valores de registro en GDB?


Respuestas:


232

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


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

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).


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.

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.

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


2
Es genial poder usar registros en expresiones con esta $sintaxis.
— remcycles
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.