conseils GDB (3) - Voir informations pile

Voir les informations de

Lorsque le programme est arrêté, la première chose que vous devez faire est de voir où le programme est ancré. Lorsque votre programme appelle une fonction, adresse de la fonction, les paramètres de la fonction, les variables locales dans la fonction seront pressées dans la « pile » (Stack) dans. Vous pouvez utiliser la commande GDB pour afficher des informations sur la pile actuelle.

Voici quelques informations sur la pile d'appel de la fonction de visualisation des commandes GDB:

  • backtrace
  • bt

    Imprimer toutes les informations sur la pile d'appels de fonction en cours. Tels que:

  •     (BDG) bt
  •     # 0 func (n = 250) à tst.c: 6
  •     # 1 0x08048524 dans main (argc = 1, argv = 0xbffff674) à tst.c: 30
  •     # 2 0x400409ed dans __libc_start_main () de /lib/libc.so.6 

    Comme on peut le voir à partir de l'appel fonction des informations de la pile: __ libc_start_main -> main () -> func ()
   

  • backtrace <n>
  • bt <n>

    n est un nombre entier positif, l'information d'impression sur la pile uniquement de la pile n-couche.

  • backtrace <-n>
  • bt <-n>

    une table d' informations de la pile entière -n-négative est imprimée seulement au-dessous de la pile n-couche.
       
Si vous voulez voir un certain niveau d'information, vous devez changer la pile actuelle, en général, lorsque le programme cesse, le niveau haut de la pile est la pile actuelle, si vous voulez voir les détails de la pile de couche sous - jacente, la première chose à faire est commutation de pile actuelle.

  • cadre <n>
  • f <n>

    n est un nombre entier de 0 est le nombre de couches de l'empilement. Par exemple: l'image 0, indique la pile, le cadre 1, le deuxième empilement de couches de la Fig.

  • up <n>

    Il représente le mouvement de la pile au-dessus de la couche n, n ne peut pas jouer, représente un déplacement de la couche vers le haut.
   

  • vers le bas <n>

    Représente un mouvement vers le bas empilement de n, n ne peut pas jouer, la couche déplaçant vers le bas.
   

La commande ci-dessus permet d'imprimer sur la couche d'informations est déplacé vers la pile. Si vous ne voulez pas laisser jouer l'information. Vous pouvez utiliser ces trois commandes:

  •     sélectionner trame de commande <n> correspondant à la trame.
  •     mise en silence <n> correspond à la commande de suivi.
  •     vers le bas en silence <n> correspond à la commande de descente.

Afficher des informations sur la pile actuelle de couches, vous pouvez utiliser les commandes GDB:

  • cadre ou f

    Imprimera ces informations: pile de numéro de couche, les noms de fonction en cours, les paramètres de la fonction, et le numéro de ligne où les fonctions de fichier, fonction pour exécuter l'instruction.

  • cadre d'info
  • information f

        Cette commande permet d'imprimer des informations plus détaillées sur la pile actuelle des couches, mais, adresse Nene la plupart du temps d'exécution. Par exemple: adresse de la fonction, l'adresse de l'appel de fonction, l'adresse de la fonction appelée, la fonction actuelle de ce qui est écrit dans le langage de programmation, la fonction et la valeur de l'adresse de paramètre, l'adresse d'une variable locale, et ainsi de suite. Tels que:

(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8   
  • informations args

   Imprimez le nom du paramètre actuel et la valeur de la fonction.

  • informations habitants

   Imprimez toutes les variables locales et la valeur actuelle de la fonction.
  

  • informations prises

   Imprimez les informations de processus d'exception de la fonction actuelle.

            
Voir le texte source

Une source d'affichage

GDB peut imprimer le débogueur de code source, bien sûr, le programme doit être compilé avec des paramètres -g add pour compiler les informations de code source dans le fichier exécutable. Sinon, vous ne pouvez pas voir le code source. Lorsque le programme cesse, GDB fera rapport sur le programme arrêté à les premières lignes du fichier. Vous pouvez utiliser la commande list pour imprimer le code source du programme. Ou jeter un oeil à la vue du code source barre de commande GDB.
   

  • liste <linenum>

    Afficher le code source du programme autour de la première ligne de linenum.

  • Liste <function>

    Fonction d'affichage nommée fonction de la fonction source.
   

  • liste

    Affiche le courant derrière la ligne source.

  • liste -

    Affiche la première ligne actuelle du code source.

5 est généralement imprimée sur la ligne courante et la ligne suivante 5, si la fonction d'affichage sont les 8 rangées inférieures sont les lignes 2, la ligne 10 est la valeur par défaut, bien entendu, la portée peut aussi être affichage personnalisé, en utilisant la commande suivante pour définir une source d'affichage le nombre de lignes.

  • mettre ListSize <count>

    Définition d'un certain nombre de lignes d'affichage du code source.
   

  • Afficher ListSize

    ListSize afficher les paramètres actuels.
       

commande de liste a également l'utilisation suivante:

  • liste <first>, <dernier>

    Affiche la première ligne à la dernière ligne de code source entre les deux.

  • liste, <dernière>

    Affiche la ligne de source de courant à la dernière ligne entre les deux.
   

  • liste +

    afficher ensuite le code source.
       

En général, cela peut être suivi par les paramètres suivants à l'arrière de leur liste:

<linenum>   行号。
<+offset>   当前行号的正偏移量。
<-offset>   当前行号的负偏移量。
<filename:linenum>  哪个文件的哪一行。
<function>  函数名。
<filename:function> 哪个文件中的哪个函数。
<*address>  程序运行时的语句在内存中的地址。

En second lieu, la recherche du code source

Non seulement cela, GDB fournit également le code source commande de recherche:

  • avant IDENTITÉ <regexp>
  • Rechercher <regexp>

    Recherche à l'avant.

  • inverse recherche <regexp>

        Toutes les recherches.
       
Où, <regexp> est une expression régulière, mais aussi une chaîne de correspondance de motif maître, sur les expressions régulières, je ne vais pas parler ici, mais s'il vous plaît voir les informations pertinentes.


Troisièmement, spécifiez le chemin du fichier source

Parfois, la mise en œuvre du programme après la compilation -g inclus uniquement dans le nom du fichier source sans nom de chemin. GDB fournit commande vous permet de spécifier le chemin du fichier source pour la recherche GDB.

  • répertoire <rép ...>
  • dir <rép ...>

    Ajout d'un chemin de fichier source à l'avant de la voie actuelle. Si vous souhaitez spécifier plusieurs chemins, vous pouvez utiliser UNIX « : » Sous Windows, vous pouvez utiliser « ;. »

  • annuaire

    source d'information de chemin de recherche claire pour tous les usages.

  • Afficher les répertoires

    Il définit l'affichage du fichier source chemin de recherche.
       

Quatrièmement, la mémoire source

Vous pouvez utiliser la commande de ligne d'information pour afficher le code source pour une adresse en mémoire. Ligne d'information de retour peut être suivi par des « numéros de ligne », « fonction », « Nom du fichier: numéro de la ligne », « Nom du fichier: fonction », cette commande permet d'imprimer l'adresse de mémoire du code source spécifié lors de l'exécution, tels que:

(gdb) Ligne info tst.c: func
ligne 5 commence "de tst.c" à l' adresse 0x8048456 <func + 6> et se termine à 0x804845d <func + 13>.

Il y a aussi une commande (désassembler) Vous pouvez voir le code source du code actuel de la machine lorsqu'il est exécuté, cette commande vider la mémoire d'instructions présente sur. L'exemple suivant représente la vue fonction func code assembleur.

(gdb) disassemble func
Dump of assembler code for function func:
0x8048450 <func>:       push   %ebp
0x8048451 <func+1>:     mov    %esp,%ebp
0x8048453 <func+3>:     sub    $0x18,%esp
0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
0x804845d <func+13>:    movl   $0x1,0xfffffff8(%ebp)
0x8048464 <func+20>:    mov    0xfffffff8(%ebp),%eax
0x8048467 <func+23>:    cmp    0x8(%ebp),%eax
0x804846a <func+26>:    jle    0x8048470 <func+32>
0x804846c <func+28>:    jmp    0x8048480 <func+48>
0x804846e <func+30>:    mov    %esi,%esi
0x8048470 <func+32>:    mov    0xfffffff8(%ebp),%eax
0x8048473 <func+35>:    add    %eax,0xfffffffc(%ebp)
0x8048476 <func+38>:    incl   0xfffffff8(%ebp)
0x8048479 <func+41>:    jmp    0x8048464 <func+20>
0x804847b <func+43>:    nop
0x804847c <func+44>:    lea    0x0(%esi,1),%esi
0x8048480 <func+48>:    mov    0xfffffffc(%ebp),%edx
0x8048483 <func+51>:    mov    %edx,%eax
0x8048485 <func+53>:    jmp    0x8048487 <func+55>
0x8048487 <func+55>:    mov    %ebp,%esp
0x8048489 <func+57>:    pop    %ebp
0x804848a <func+58>:    ret
End of assembler dump.

 
----------------
Avertissement: Cet article est l'article original blogueurs RPSC « de haoel », et suivi CC BY-SA 4.0 accord du droit d'auteur, reproduit, s'il vous plaît joindre le lien source d' origine et cette déclaration. .
Lien original: https: //blog.csdn.net/haoel/article/details/2882

Publié 175 articles originaux · Praise gagné 262 · vues 700 000 +

Je suppose que tu aimes

Origine blog.csdn.net/li_wen01/article/details/105223367
conseillé
Classement