Respuestas:
info registers
muestra todos los registros; info registers eax
muestra solo el registro eax
. El comando se puede abreviar comoi r
info registers eax
. Sin embargo, no estoy seguro de si esto es diferente para diferentes versiones de gdb.
register read [eax]
display
. Por ej display $eax
.
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).
eax
, ecx
y otros registros estándar ocultos por info registers
. Probablemente esta debería ser la respuesta aceptada.
info registers
muestre los registros.display $esp
continúe mostrando registros esp en la línea de comando gdb.layout regs
continúe mostrando registros, con el modo TUI.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-7
y 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.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
$
sintaxis.
layout reg
para 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.