Réponses:
info registers
montre tous les registres; info registers eax
montre juste le registre eax
. La commande peut être abrégée commei r
info registers eax
. Je ne suis cependant pas sûr que ce soit différent pour les différentes versions de gdb.
register read [eax]
display
. Pour par exemple display $eax
.
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 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 à la plate-forme (comme NEON Q ... sur ARM).
eax
, ecx
et d' autres registres standards cachés par info registers
. Cela devrait probablement être la réponse acceptée.
info registers
affichez les registres.display $esp
continuez à afficher les registres esp dans la ligne de commande gdb.layout regs
continuez à afficher les registres, avec le mode TUI.Commandes gdb :
i r <register_name>
: imprimer 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
: imprime tous les registres sauf le registre flottant et vectoriel (xmm, ymm, zmm).i r a
: imprimer tous les registres, inclure les registres à virgule flottante et vectoriel (xmm, ymm, zmm).i r f
: imprimer tous les registres flottants FPU ( st0-7
et quelques autres f*
)D'autres groupes de registres en plus de a
( all
) et f
( float
) peuvent être trouvés avec:
maint print reggroups
comme documenté à l' adresse : https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Conseils :
xmm0
~ xmm15
, sont 128 bits, presque toutes les machines modernes l'ont, ils sont sortis en 1999.ymm0
~ ymm15
, sont de 256 bits, les nouvelles machines l'ont généralement, ils sont publiés en 2011.zmm0
~ zmm31
, sont 512 bits, les PC normaux ne l'ont probablement pas ( comme l'année 2016 ), ils sont sortis en 2013, et principalement utilisés 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 sélectionner entre différents membres de l'union, par exemple pour les registres à virgule flottante ARM qui peuvent être des nombres à virgule flottante ou des entiers:
p $s0.f
p $s0.u
À partir de la documentation :
Tout nom précédé de '$' peut être utilisé pour une variable de commodité, 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, comme des variables dont les noms commencent par «$». Les noms des registres sont différents pour chaque machine; utilisez les registres d'informations 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
Voir: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623
$
syntaxe.
layout reg
pour que gdb affiche un tableau de tous les registres d'entiers et d'indicateurs, mettant en évidence le ou les registres modifiés par l'instruction précédente. Voir stackoverflow.com/tags/x86/info par exemple.