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 raxir <register_name>: imprime un solo registro, por ejemplo,ir rax,ir eax -
ir <register_name_1> <register_name_2> ...ir rdi rsiir <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 registersmuestran los registros. - Si solo desea ver un registro, por ejemplo,
display $espcontinúe mostrando los registros especiales en la línea de comando de gdb. - Si quiere ver todos los registros, las
layout regscontinúan mostrando registros, con el modo TUI.