¿Cómo imprimo el valor de %eax
y %ebp
?¿Cómo imprimir valores de registro en GDB?
(gdb) p $eax
$1 = void
¿Cómo imprimo el valor de %eax
y %ebp
?¿Cómo imprimir valores de registro en GDB?
(gdb) p $eax
$1 = void
info registers
muestra todos los registros; info registers eax
muestra solo el registro eax
. El comando se puede abreviar como i r
Obtengo: Registro inválido '% eax ' Y si acabo de hacer" registros de información ", eax no aparece. Sin embargo, estoy mirando mi ensamblado 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
Mismo problema:% eax está en el código, pero print $ eax muestra vacío. –
La respuesta de Bridgette funciona para mí. La respuesta de geekosaur es correcta, pero debes omitir el signo%, por lo que el comando para un registro específico es 'info registers eax'. Aunque no estoy seguro de si esto es diferente para las diferentes versiones de gdb. – Kevin
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
Aquellos puede abreviarse como:
i r rip
También hay:
info all-registers
entonces se puede obtener el nombre del registro que está interesado en - muy útil para buscar plataforma- registros específicos (como NEON Q ... en ARM).
Esto enseñó sobre los registros que no sabía que existían :-) –
En mi máquina, esto imprime 'eax',' ecx', y otros registros estándar ocultos por 'info registers'. Esta debería ser probablemente la respuesta aceptada. – EntangledLoops
funciona como del BGF 7.7.1, el comando que ha intentado:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
De the docs:
Cualquier nombre precedido por '$' se puede utilizar para una variable de conveniencia, a menos que sea uno de los nombres de registro específicos de la máquina predefinidos.
and:
Se puede hacer referencia a contenido de los registros de la máquina, en las 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 no he tenido mucha suerte con los registros de control hasta el momento: 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
info registers
muestran los registros.display $esp
continúe visualizando registros especiales en la línea de comandos de gdb.layout regs
continue show registers, con modo TUI. ComandosGdb:
i r <register_name>
: imprimir un registro único, e.g 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
: imprimir toda registro excepto de punto flotante & registro vectorial (XMM, ymm, ZMM).
i r a
: imprimir todo el registro, incluir punto flotante & registro vectorial (xmm, ymm, zmm).
Consejos:
xmm0
~ xmm15
, son 128 bits, casi cada máquina moderna tiene, que son liberados en 1999.ymm0
~ ymm15
, son 256 bits, nuevos máquina generalmente lo tienen, se lanzan en 2011.zmm0
~ zmm31
, son 512 bits, PC normal probablemente no lo tengo (como el año 2016), se lanzan en 2013, y se utilizan principalmente en servidores hasta el momento.
Utilice 'layout reg' para que gdb muestre una tabla de todos los registros de entero y de bandera, resaltando los que hayan cambiado con las instrucciones anteriores. Ver http://stackoverflow.com/tags/x86/info por ejemplo. –