Cómo imprimir valores de registro en GDB?
cpu-registers (6)
¿Cómo %ebp
el valor de %eax
y %ebp
?
(gdb) p $eax
$1 = void
A partir de GDB 7.7.1, el comando que has probado funciona:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
De los documentos :
Cualquier nombre precedido por ''$'' se puede usar para una variable de conveniencia, a menos que sea uno de los nombres de registro específicos de la máquina predefinidos.
and :
Puede referirse a los contenidos 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; usa registros de información para ver los nombres usados en tu 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 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
Si intenta 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 pueden ser abreviados a:
i r rip
También hay:
info all-registers
Luego puede obtener el nombre del registro que le interesa, muy útil para encontrar registros específicos de la plataforma (como NEON Q ... en ARM).
info registers
muestran todos los registros; info registers eax
muestra solo el registro eax
. El comando se puede abreviar como ir
Comandos de Gdb :
-
ir <register_name>
ir rax
ir <register_name>
: imprime un solo registro, por ejemplo,ir rax
,ir eax
-
ir <register_name_1> <register_name_2> ...
ir rdi rsi
ir <register_name_1> <register_name_2> ...
: imprime varios registros, por ejemplo,ir rdi rsi
, ir
: imprime todo el registro excepto el punto flotante y el registro vectorial (xmm, ymm, zmm).ira
: imprime todo el registro, incluye el registro de coma flotante y vectorial (xmm, ymm, zmm).
Consejos :
-
xmm0
~xmm15
, son 128 bits, casi todas las máquinas modernas lo tienen, se lanzan en 1999. -
ymm0
~ymm15
, son 256 bits, la nueva máquina generalmente lo tiene, se lanzan en 2011. -
zmm0
~zmm31
, son 512 bits, la PC normal probablemente no la tenga ( como el año 2016 ), se lanzan en 2013 y se usan 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.
- Si solo quieres comprobarlo una vez, los
info registers
muestran los registros. - Si solo desea ver un registro, por ejemplo,
display $esp
continúe mostrando los registros especiales en la línea de comando de gdb. - Si quiere ver todos los registros, las
layout regs
continúan mostrando registros, con el modo TUI.