Comment imprimer les valeurs de registre dans GDB?


191

Comment imprimer la valeur de %eaxet %ebp?

(gdb) p $eax
$1 = void

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


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

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


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.

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

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


2
C'est formidable de pouvoir utiliser des registres dans des expressions avec cette $syntaxe.
— remcycles le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.