Comment imprimer la valeur de %eax
et %ebp
?
(gdb) p $eax
$1 = void
info registers
affiche tous les registres; info registers eax
affiche uniquement le registre eax
. La commande peut être abrégée en i r
Si vous essayez d'imprimer un registre spécifique dans GDB, vous devez omettre le signe%. Par exemple,
info registers eip
Si votre exécutable est en 64 bits, les registres commencent par r. Les démarrer avec e n'est pas valide.
info registers rip
Ceux-ci peuvent être abrégés en:
i r rip
Il y a aussi:
info all-registers
Ensuite, vous pouvez obtenir le nom du registre qui vous intéresse - très utile pour trouver des registres spécifiques à une plate-forme (comme NEON Q ... sur ARM).
info registers
affiche les registres.display $esp
continue à afficher les registres esp dans la ligne de commande gdb.layout regs
continuez les registres d'exposition, en mode TUI.Commandes Gdb :
i r <register_name>
: affiche un seul registre, par exemple i r rax
, i r eax
i r <register_name_1> <register_name_2> ...
: imprimer plusieurs registres, par exemple i r rdi rsi
,i r
: affiche tous les registres sauf les registres à virgule flottante et vectorielle (xmm, ymm, zmm).i r a
: affiche tous les registres, y compris les registres à virgule flottante et vectorielle (xmm, ymm, zmm).i r f
: affiche tous les registres flottants FPU (st0-7
et quelques autres f*
)D'autres groupes de registres que a
(all
) et f
(float
) peuvent être trouvés avec:
maint print reggroups
comme documenté à: https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Astuces :
xmm0
~ xmm15
, sont en 128 bits, presque toutes les machines modernes en sont pourvues, elles sont publiées en 1999.ymm0
~ ymm15
, sont en 256 bits, les nouveaux ordinateurs l’ont généralement, ils sont publiés en 2011.zmm0
~ zmm31
, 512 bits sont, les PC normaux ne l'ont probablement pas ( comme l'année 2016 ), ils sont libérés en 2013, et principalement utilisé dans les serveurs jusqu'à présent.p $eax
fonctionne à partir de GDB 7.7.1
Depuis GDB 7.7.1, la commande que vous avez essayée fonctionne:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
Cette syntaxe peut également être utilisée pour choisir entre différents membres d'union, par exemple. pour ARM _ registres à virgule flottante pouvant être des nombres à virgule flottante ou des nombres entiers:
p $s0.f
p $s0.u
De les docs :
Tout nom précédé de "$" peut être utilisé pour une variable de confort, sauf s’il s’agit d’un des noms de registre prédéfinis spécifiques à la machine.
et :
Vous pouvez faire référence au contenu du registre de la machine, dans les expressions, sous forme de variables dont le nom commence par "$". Les noms des registres sont différents pour chaque machine. utilisez les registres d’information pour voir les noms utilisés sur votre machine.
Mais je n'ai pas eu beaucoup de chance avec les registres de contrôle jusqu'à présent: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Demande de fonctionnalité 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
Registres à virgule flottante ARM