Comment imprimer des valeurs de Registre dans GDB?
comment imprimer la valeur de %eax
et %ebp
?
(gdb) p $eax
= void
6 réponses
info registers
montre tous les registres; info registers eax
montre seulement le registre eax
. La commande peut être abrégée comme 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 64 bits, les registres commencent par R. Les Démarrer par e n'est pas valide.
info registers rip
ceux qui peuvent être abrégés en:
i r rip
il y a aussi:
info all-registers
alors vous pouvez obtenir le nom de Registre qui vous intéresse -- très utile pour trouver des registres spécifiques à une plate-forme (comme le Neon Q... sur les BRAS).
- Si seulement voulez vérifier une fois,
info registers
afficher les registres. - si vous voulez seulement regarder un registre, par exemple,
display $esp
continuer à afficher les registres esp en ligne de commande gdb. - Si vous voulez regarder tous les registres,
layout regs
continuer à montrer les registres, avec TUI mode.
Gdb commandes :
-
i r <register_name>
: imprimer un registre unique, E. gi r rax
,i r eax
-
i r <register_name_1> <register_name_2> ...
: Print multiple registers, E. gi r rdi rsi
, "
-
i r
: l'impression de tous vous inscrire à l'exception de virgule flottante et vecteur de registre (xmm, ymm, zmm). -
i r a
: imprimer tous les registres, inclure virgule flottante et vecteur de registre (xmm, ymm, zmm).
Conseils :
-
xmm0
~xmm15
, sont 128 bits, presque toutes les machines modernes l'ont, ils sont publiés en 1999. -
ymm0
~ymm15
, sont 256 bits, nouvelle machine l'ont généralement, ils sont publiés en 2011. -
zmm0
~zmm31
, sont 512 bits, pc normal ne l'ont probablement pas ( comme l'année 2016 ), ils sont libérés en 2013, et principalement utilisés dans les serveurs jusqu'à présent. - une seule série de XMM / ymm / zmm sera affichée, car ce sont les mêmes registres dans un mode différent. Sur ma machine ymm est montré.
à partir de GDB 7.7.1, la commande que vous avez essayée fonctionne:
set $eax = 0
p $eax
# = 0
set $eax = 1
p $eax
# = 1
à Partir de les docs :
tout nom précédé de ’ $ ' peut être utilisé pour une variable de commodité, à moins qu'il ne s'agisse d'un des noms de registre prédéfinis propres à la machine.
et :
vous pouvez vous référer au contenu du expressions, comme variables avec des noms commençant par’$'. Les noms de registres sont différents pour chaque machine; utiliser info registres de 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 / / 2005 requête principale https://www.sourceware.org/ml/gdb/2005-03/msg00158.html / / alt.lang.asm 2013 https://groups.google.com/forum/#!topic / alt.lang.asm / JC7YS3Wu31I