Comment imprimer les valeurs de registre dans GDB?

191

Comment imprimer la valeur de %eaxet %ebp?

(gdb) p $eax
$1 = void
assem
la source
8
Utilisez layout regpour 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.
Peter Cordes

Réponses:

232

info registersmontre tous les registres; info registers eaxmontre juste le registre eax. La commande peut être abrégée commei r

geekosaure
la source
J'obtiens: Registre invalide `% eax 'Et si je fais juste des" registres d'informations ", eax n'apparaît pas. Pourtant, je regarde mon assemblage de code dans l'IDE où un signal EXC_BAD_ACCESS a été généré avec l'instruction: test% eax,% eax C'est dans XCode exécutant gdb. Pourquoi gdb ne signale-t-il pas le registre EAX?
NoahR
1
Même problème:% eax est dans le code, mais print $ eax montre void.
Ruslan Yushchenko
5
La réponse de Bridgette fonctionne pour moi. La réponse de geekosaur est généralement juste, mais vous devez omettre le signe%, donc la commande pour un registre spécifique est info registers eax. Je ne suis cependant pas sûr que ce soit différent pour les différentes versions de gdb.
Kevin
Je cherchais la même chose pour lldb, alors laissez-moi juste noter que: pour lldb, la commande estregister read [eax]
holgac
Si vous souhaitez afficher les valeurs de registre en continu au fur et à mesure que vous parcourez le code, vous pouvez utiliser display. Pour par exemple display $eax.
srgsanky
50

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
Bridgette
la source
37

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

yano
la source
3
Cela a été enseigné sur les registres que je ne savais pas exister :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Sur ma machine, cette impression eax, ecxet d' autres registres standards cachés par info registers. Cela devrait probablement être la réponse acceptée.
EntangledLoops
15
  • Si vous voulez seulement le vérifier une fois, info registersaffichez les registres.
  • Si vous voulez seulement regarder un registre, par exemple, display $espcontinuez à afficher les registres esp dans la ligne de commande gdb.
  • Si vous voulez regarder tous les registres, layout regscontinuez à afficher les registres, avec le mode TUI.
liuyang1
la source
12

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-7et 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.
  • Une seule série de xmm / ymm / zmm sera affichée, car ce sont les mêmes registres dans des modes différents. Sur ma machine, ymm est affiché.
Eric Wang
la source
6

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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
2
C'est formidable de pouvoir utiliser des registres dans des expressions avec cette $syntaxe.
remcycles le