>> DOUG LLOYD: Très bien GDB.
Quel est-il exactement?
Donc, GDB, ce qui signifie pour le débogueur GNU,
est un outil vraiment génial que nous puissions utiliser pour nous aider à déboguer nos programmes,
ou savoir où les choses sont qui ne va pas dans nos programmes.
GDB est incroyablement puissant, mais la sortie et l'interaction avec elle
peut être un peu cryptique.
Il est généralement un outil de ligne de commande, et il peut jeter beaucoup de messages à vous.
Et il peut un peu difficile de analyser exactement ce qui se passe.
Étapes Heureusement, nous avons prises pour résoudre ce problème pour vous
que vous travaillez à travers CS50.
Si vous n'êtes pas utilisez le graphique débogueur, dont mon collègue Dan
Armandarse a parlé assez un peu dans une vidéo qui
devrait être plus ici en ce moment, vous pourriez avoir besoin
à utiliser ces lignes de commande outils pour travailler avec GDB.
Si vous travaillez dans le CS50 IDE, vous ne devez pas le faire.
Mais si vous n'êtes pas travaillant dans le CS50 IDE,
peut-être en utilisant une version du CS50 Appliance,
ou autre exploitation Linux système avec GDB installée sur elle,
vous pouvez avoir besoin d'utiliser ces outils de ligne de commande.
>> Et puisque vous pourriez ont pour ce faire, il est
utile juste pour comprendre comment GDB fonctionne à partir de la ligne de commande.
Mais encore une fois, si vous êtes l'aide de l'IDE CS50, vous
peut utiliser le débogueur graphique qui est intégré dans l'IDE.
Donc, pour faire avancer les choses avec GDB, pour démarrer le débogage
processus d'un particulier programme, tout ce que vous devez faire
est de type GDB suivi par le nom du programme.
Ainsi, par exemple, si votre programme est bonjour, vous taperez GDB bonjour.
>> Quand vous faites cela, vous allez à tirer vers le haut l'environnement GDB.
Votre message va changer, et au lieu d'être ce qu'il habituellement
est lorsque vous tapez les choses Au commandement line-- ls,
cd-- tous vos typique Commandes Linux, votre invite
va changer pour, probablement, quelque chose comme parenthèses GDB parenthèses.
Voilà votre nouvelle invite GDB, parce vous êtes à l'intérieur de l'environnement GDB.
Une fois à l'intérieur de cet environnement, il ya deux grands commandements
que vous aurez probablement l'utiliser dans l'ordre suivant.
>> Le premier est b, est l'abréviation de pause.
Et après avoir tapé b, vous avez l'habitude tapez le nom d'une fonction,
ou si vous connaissez autour de ce numéro de ligne
votre programme commence à se comporter un peu bizarre,
vous pouvez taper une ligne Numéro là aussi.
Quel b, ou pause, ne est qu'il permet à votre programme
à courir jusqu'à un certain point, à savoir, le nom de la fonction
que vous spécifiez ou la ligne nombre que vous spécifiez.
>> Et à ce moment, il gèlera exécution.
Ceci est une très bonne chose, parce que une fois l'exécution a été gelé,
vous pouvez commencer à très lentement étape dans votre programme.
Typiquement, si vous avez été en cours d'exécution vos programmes, ils sont assez courte.
Habituellement, vous tapez slash dot quel que soit le nom de votre programme, appuyez sur Entrée,
et avant que vous pouvez clignoter, votre programme est déjà terminé.
Il est pas vraiment beaucoup de temps pour essayer et de comprendre ce qui va mal.
Donc il vraiment d'être en mesure de ralentir les choses par la fixation d'un point de rupture avec b,
puis marcher dans.
>> Puis, une fois que vous avez configuré votre pause stade, vous pouvez exécuter le programme.
Et si vous avez une arguments de ligne de commande,
vous spécifiez ici, pas quand vous tapez le nom de votre GDB programme.
Vous spécifiez toute la ligne de commande arguments en prenant r, ou courir,
et puis les arguments de ligne de commande quel que soit vous avez besoin à l'intérieur de votre programme.
Il existe un certain nombre d'autres vraiment commandes importantes et utiles
à l'intérieur de l'environnement de PIB.
Alors laissez-moi juste rapidement revenir sur certains d'entre eux.
>> Le premier est n, qui est court pour la prochaine, et vous pouvez taper à côté place de n,
deux pourrait fonctionner.
Et il est juste le raccourci.
Et comme vous l'avez probablement déjà obtenu utilisé pour, être en mesure de saisir les choses
plus courte est généralement mieux.
Et ce qu'il va faire est il va avancer un bloc de code.
Donc, ça va aller de l'avant jusqu'à ce qu'un appel de fonction.
Et puis, au lieu de plonger dans cette fonction
et en passant par tous que les fonctions code, il aura juste la fonction.
>> La fonction sera appelée.
Il fera tout son travail est.
Il sera de retour à une valeur la fonction qui l'a appelé.
Et puis vous passez à la prochaine ligne de cette fonction d'appel.
Si vous voulez à l'étape à l'intérieur de la fonction,
lieu d'avoir juste il exécute, en particulier
si vous pensez que le problème pourrait se trouver à l'intérieur de cette fonction,
vous pourriez, bien sûr, mettre une pause point à l'intérieur de cette fonction.
Ou si vous êtes déjà en cours d'exécution, vous pouvez s utiliser pour avancer d'une ligne de code.
>> Donc, ce sera dans l'étape et plongez dans les fonctions,
au lieu d'avoir juste la execute et continue dans la fonction
que vous êtes dans pour le débogage.
Si jamais vous voulez savoir la valeur d'une variable,
vous pouvez taper p, ou Imprimer, puis le nom de la variable.
Et qui va imprimer à vous, l'intérieur de l'environnement GDB,
le nom de la variable, qui vous-- excuser moi-- la valeur de la variable
que vous avez nommé.
Si vous voulez connaître les valeurs de tous les accessible à partir de la variable locale où
vous êtes actuellement dans votre programme, vous pouvez taper info habitants.
Il est beaucoup plus rapide que en tapant p, puis que ce soit,
énumérant l'ensemble des variables que vous savez exister.
Vous pouvez taper info habitants, et il va imprimer tout pour vous.
Ensuite, il ya BT, qui est Retour court pour Trace.
Or, généralement, en particulier au début CS50,
vous ne serez pas vraiment avoir l'occasion à utiliser bt ou Retour Trace,
parce que vous n'êtes pas avoir fonctions qui appellent d'autres fonctions.
>> Vous pourriez avoir un appel principal fonction, mais qui est probablement.
Vous ne disposez pas de cette autre fonction appelant une autre fonction, qui
appelle une autre fonction, et ainsi de suite.
Mais comme vos programmes obtiennent plus complexe, et en particulier
lorsque vous commencez à travailler avec récurrence, retraçage
peut être un moyen très utile de vous laisser genre d'obtenir un certain contexte pour le cas où
Je suis dans mon programme.
Alors dites que vous avez écrit votre code, et vous savez que la principale appelle une fonction
f, qui appelle une fonction g, ce qui appelle une fonction h.
Nous avons donc plusieurs couches de nidification se passe ici.
>> Si vous êtes à l'intérieur du votre environnement GDB,
et vous savez que votre intérieur de h, mais vous oubliez
à propos de ce que tu as à où vous soient: vous pouvez taper bt, ou de retraçage,
et il affichera h, g, f principale, à côté d'une autre information, qui
vous donne un indice que, principale OK appelé f, f appelé g, g appelé h,
et voilà où je je suis actuellement dans mon programme.
Ainsi, il peut être vraiment utile, d'autant plus que l'énigmatique-ness de GDB
devient un peu écrasante, à de savoir exactement où sont les choses.
Enfin, lorsque votre programme est fait, ou lorsque vous avez terminé le déboguer
et que vous voulez prendre du recul de l'environnement GDB,
elle permet de savoir comment sortir de celui-ci.
Vous pouvez taper q, ou Quitter pour sortir.
Maintenant, avant que la vidéo d'aujourd'hui Je préparais un programme bogué
appelé buggy1, que je compilé partir d'un fichier appelé buggy1.c.
Comme vous vous en doutez, cette programme est en fait buggy.
Quelque chose se passe mal quand je tente de l'exécuter.
Maintenant, malheureusement, je inadvertance supprimé mon fichier buggy1.c,
Donc, pour moi de comprendre ce qui va mal avec ce programme,
Je vais avoir à utiliser GDB genre d'aveuglement, en essayant
de naviguer à travers ce programme comprendre exactement ce qui va mal.
Mais en utilisant seulement les outils nous avons déjà appris,
nous pouvons à peu près la figure exactement ce qu'il est.
Donc, nous allons la tête sur CS50 IDE et ont un regard.
OK, donc nous sommes ici dans mon CS50 environnement IDE,
et je zoome un peu de sorte que vous pouvez voir un peu plus.
Dans ma fenêtre de terminal, si je liste le contenu de mon actuel directeur
avec ls, nous verrons que je avoir un couple de fichiers source
ici, y compris la buggy1 discuté précédemment.
Qu'est-ce qui se passe exactement quand Je essaye et cours buggy1.
Eh bien nous allons découvrir.
Je tape slash dot, poussette, et je pressez Entrée.
>> Des erreurs de segmentation.
Ce n'est pas bien.
Si vous vous souvenez, un segmentation fault généralement
se produit lorsque nous accédons à la mémoire que nous ne sommes pas autorisés à toucher.
Nous avons en quelque sorte atteint en dehors des limites
de ce programme, la compilateur, nous a donné.
Et donc déjà que ya une idée à garder à la boîte à outils
que nous commençons le processus de débogage.
Quelque chose a un peu de mal ici.
>> Le début de tous les droits, alors laissez- l'environnement GDB
et voir si nous pouvons comprendre exactement ce que le problème est.
Je vais effacer mon écran, et je vais taper GDB
à nouveau, à pénétrer dans l'environnement GDB, et le nom du programme
que je veux pour déboguer, buggy1.
Nous obtenons un petit message, la lecture symboles de buggy1, fait.
Tout ce qui signifie qu'il est tiré ainsi tout le code,
et maintenant il a été chargé dans GDB, et il est prêt à aller.
>> Maintenant, qu'est-ce que je veux faire?
Vous rappelez-vous ce que le première étape est typiquement
après je suis à l'intérieur de cet environnement?
Heureusement, vous ledit ensemble un point de rupture, parce
en fait, qui est ce que je veux faire.
Maintenant, je ne l'ai pas code source pour cette
en face de moi, ce qui est probablement pas le cas d'utilisation typique, par la manière.
Vous aurez probablement.
Donc, ce qui est bon.
Mais en supposant que vous ne le faites pas, ce qui est une fonction qui vous savez
existe dans chaque programme C?
Peu importe la taille ou la complexité il est, cette fonction existe certainement.
Main, à droite?
>> Donc, ne pas tout, nous pouvons définir un point principal de pause.
Et encore, je ne pouvais tout simplement taper briser principale, au lieu de b.
Et si vous êtes curieux, si vous jamais taper une longue commande
et ensuite réaliser que vous tapé la mauvaise chose,
et vous voulez vous débarrasser Tout comme je viens de le faire,
vous pouvez prendre le contrôle U, qui sera supprimer tout et vous ramènera
au début des lignes de curseur.
Beaucoup plus rapide que juste maintenez la supprimer, ou de frapper un temps de botte
plus de.
>> Donc, nous allons définir un point de rupture au principal.
Et comme vous pouvez le voir, il est dit que nous avons définir un point de rupture au fichier buggy1.c,
et apparemment la première ligne du code de la ligne principale est de sept ans.
Encore une fois, nous ne disposons pas le fichier source ici,
mais je suppose qu'il est me dire la vérité.
Et puis, je vais juste essayer et exécuter le programme, r.
Démarrage du programme.
Très bien, alors ce message est un peu cryptique.
Mais fondamentalement, ce qui est est-ce qui se passe ici est juste
me disant que je l'ai frappé ma pause point, point pause numéro 1.
>> Et puis, cette ligne de code, Aucun fichier ou répertoire de ce nom.
La seule raison pour laquelle Je vois ce message
est parce que je inadvertance supprimé mon fichier buggy.c.
Si mon dossier buggy1.c existait dans le répertoire courant,
ce droit de la ligne, il serait effectivement me dire ce que la ligne de code
lit littéralement.
Malheureusement, je l'ai effacé.
Nous allons avoir à type de naviguer grâce à cela un peu plus à l'aveuglette.
>> OK, donc nous allons voir, ce ce que je veux faire ici?
Eh bien, je voudrais savoir ce que locale peut-être les variables sont disponibles pour moi.
Je l'ai commencé mon programme.
Voyons voir ce qui pourrait être déjà initialisé pour nous.
Je tape Information habitants, pas les habitants.
Tout droit, de sorte que ne me donner une tonne d'informations.
Je pourrais essayer et imprimer une variable, mais je ne connais pas les noms de variables.
Je pourrais essayer une trace de dos, mais je suis à l'intérieur de la principale,
donc je sais que je ne l'ai pas fait une autre fonction appel en ce moment.
>> Semble tellement comme mes seules options sont à utiliser n ou deux et commencer à plonger.
Je vais utiliser n.
Donc je tape n.
Oh mon Dieu, qu'est-ce qui se passe ici.
Programme des signaux reçus, SIGSEGV segmentation fault,
puis tout un tas de trucs.
Je suis déjà débordés.
Eh bien, il ya en fait une beaucoup à apprendre ici.
Alors qu'est-ce que cela nous dit?
Qu'est-ce qu'il nous dit est, ce programme est sur le point, mais n'a pas encore, faute seg.
Et en particulier, je vais pour agrandir encore plus ici,
il est sur le seg faute propos quelque chose appelé strcmp.
>> Maintenant, nous ne pouvons pas en avons discuté cette fonction largement.
Mais il est-- parce que nous ne sommes pas aller pour parler de toutes les fonctions que
existe dans le standard C library-- mais ils sont tous disponibles pour vous,
en particulier si vous prenez un regarder reference.cs50.net.
Et strcmp est un très puissant fonction qui existe à l'intérieur
de l'en-tête string.h fichier, ce qui est un en-tête
fichier qui est dédié à des fonctions qui travaillent avec et manipuler des chaînes.
>> Et en particulier, ce qui ne fait que strcmp il compare les valeurs des deux chaînes.
Donc, je suis sur le point de segmentation fault sur un appel à strcmp il semble.
Je frappe n, et en fait je reçois le message, programme terminé par le signal SIGSEGV
segmentation fault. Alors maintenant Je l'ai fait seg en défaut,
et mon programme a assez beaucoup efficacement renoncé.
Ceci constitue la fin du programme.
Il est tombé en panne, il est écrasé.
Donc avait pas beaucoup, mais je a effectivement fait apprendre un peu
à partir de ce peu d'expérience.
Qu'ai-je appris?
Eh bien, mon programme se bloque à peu près immédiatement.
Mon programme se bloque sur Un appel à strcmp, mais je
ne pas avoir de variables locales dans mon programme au moment où il se bloque.
Alors quelle chaîne, ou chaînes, pourrais-je être comparer.
Si je ne ai pas locale les variables, vous pourriez
présume que je have-- il est peut-être un variable globale, qui pourrait être vrai.
>> Mais en général, il semble comme je suis comparant
à quelque chose qui ne existe pas.
Donc, nous allons enquêter un peu plus loin.
Donc, je vais effacer mon écran.
Je vais arrêter de sortir de la Environnement GDB pour une seconde.
Et je suis penser, OK, donc il n'y a pas de variables locales dans mon programme.
Je me demande si peut-être je suis censé passer dans une chaîne comme argument de ligne de commande.
Alors disons simplement tester ceci.
Je ne l'ai pas fait cela avant.
>> Voyons voir si peut-être si je exécuter ce programme avec un argument de ligne de commande cela fonctionne.
Huh, sans aucune faute de segmentation il.
Il m'a juste dit que je figured it out.
Alors peut-être que ce le correctif ici.
Et en effet, si je vais en arrière et regarder le code source réelle pour buggy1.c,
il semble que ce que je fais est Je fais un appel à strcmp sans
vérifier si, en fait, argv [1] existe.
Ceci est en fait la code source pour buggy1.c.
Donc ce que je dois vraiment faire ici de fixer mon programme,
en supposant que je l'ai déposer en face de moi, est
d'ajouter simplement un chèque à faire assurer que argc est égal à 2.
Donc cet exemple, encore une fois, comme je le disais, est un peu artificiel, non?
Vous êtes généralement pas aller à accidentellement supprimer votre code source
et d'avoir à essayer et déboguer le programme.
Mais je l'espère, il a donné vous une illustration
des sortes de choses qui vous pourriez penser à
que vous êtes le débogage de votre programme.
>> Quelle est la situation ici?
Quelles sont les variables-je avoir accès à moi?
Où est exactement mon programme écraser, sur quelle ligne,
sur ce que l'appel à quelle fonction?
Quel genre d'indices que cela me donner?
Et cela est exactement la genre de mentalité que vous
devrait être dans le moment où vous êtes penser à déboguer vos programmes.
>> Je suis Doug Lloyd.
Ceci est CS50.