web-dev-qa-db-fra.com

Comment imprimer les valeurs de registre dans GDB?

Comment imprimer la valeur de %eax et %ebp?

(gdb) p $eax
$1 = void
172
assem

info registers affiche tous les registres; info registers eax affiche uniquement le registre eax. La commande peut être abrégée en i r

204
geekosaur

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
49
Bridgette

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).

36
yano
  • Si seulement vous voulez le vérifier une fois, info registers affiche les registres.
  • Si seulement vous voulez surveiller un registre, par exemple, display $esp continue à afficher les registres esp dans la ligne de commande gdb.
  • Si vous voulez regarder tous les registres, layout regs continuez les registres d'exposition, en mode TUI.
12
liuyang1

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.
  • Une seule série de xmm/ymm/zmm sera affichée, car ce sont les mêmes registres dans un mode différent. Ymm est affiché sur ma machine.
9
Eric Wang

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

Voir: https://reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623#2062