1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Très bien GDB. 3 00:00:06,830 --> 00:00:08,480 Quel est-il exactement? 4 00:00:08,480 --> 00:00:11,310 Donc, GDB, ce qui signifie pour le débogueur GNU, 5 00:00:11,310 --> 00:00:15,040 est un outil vraiment génial que nous puissions utiliser pour nous aider à déboguer nos programmes, 6 00:00:15,040 --> 00:00:18,210 ou savoir où les choses sont qui ne va pas dans nos programmes. 7 00:00:18,210 --> 00:00:22,590 GDB est incroyablement puissant, mais la sortie et l'interaction avec elle 8 00:00:22,590 --> 00:00:23,830 peut être un peu cryptique. 9 00:00:23,830 --> 00:00:28,210 Il est généralement un outil de ligne de commande, et il peut jeter beaucoup de messages à vous. 10 00:00:28,210 --> 00:00:31,144 Et il peut un peu difficile de analyser exactement ce qui se passe. 11 00:00:31,144 --> 00:00:33,560 Étapes Heureusement, nous avons prises pour résoudre ce problème pour vous 12 00:00:33,560 --> 00:00:36,281 que vous travaillez à travers CS50. 13 00:00:36,281 --> 00:00:39,030 Si vous n'êtes pas utilisez le graphique débogueur, dont mon collègue Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse a parlé assez un peu dans une vidéo qui 15 00:00:41,570 --> 00:00:44,740 devrait être plus ici en ce moment, vous pourriez avoir besoin 16 00:00:44,740 --> 00:00:48,270 à utiliser ces lignes de commande outils pour travailler avec GDB. 17 00:00:48,270 --> 00:00:51,250 Si vous travaillez dans le CS50 IDE, vous ne devez pas le faire. 18 00:00:51,250 --> 00:00:53,550 Mais si vous n'êtes pas travaillant dans le CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 peut-être en utilisant une version du CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 ou autre exploitation Linux système avec GDB installée sur elle, 21 00:00:58,860 --> 00:01:00,980 vous pouvez avoir besoin d'utiliser ces outils de ligne de commande. 22 00:01:00,980 --> 00:01:02,860 >> Et puisque vous pourriez ont pour ce faire, il est 23 00:01:02,860 --> 00:01:06,280 utile juste pour comprendre comment GDB fonctionne à partir de la ligne de commande. 24 00:01:06,280 --> 00:01:09,650 Mais encore une fois, si vous êtes l'aide de l'IDE CS50, vous 25 00:01:09,650 --> 00:01:15,400 peut utiliser le débogueur graphique qui est intégré dans l'IDE. 26 00:01:15,400 --> 00:01:18,750 Donc, pour faire avancer les choses avec GDB, pour démarrer le débogage 27 00:01:18,750 --> 00:01:21,220 processus d'un particulier programme, tout ce que vous devez faire 28 00:01:21,220 --> 00:01:23,810 est de type GDB suivi par le nom du programme. 29 00:01:23,810 --> 00:01:28,620 Ainsi, par exemple, si votre programme est bonjour, vous taperez GDB bonjour. 30 00:01:28,620 --> 00:01:31,210 >> Quand vous faites cela, vous allez à tirer vers le haut l'environnement GDB. 31 00:01:31,210 --> 00:01:33,800 Votre message va changer, et au lieu d'être ce qu'il habituellement 32 00:01:33,800 --> 00:01:35,841 est lorsque vous tapez les choses Au commandement line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- tous vos typique Commandes Linux, votre invite 34 00:01:38,115 --> 00:01:42,200 va changer pour, probablement, quelque chose comme parenthèses GDB parenthèses. 35 00:01:42,200 --> 00:01:46,630 Voilà votre nouvelle invite GDB, parce vous êtes à l'intérieur de l'environnement GDB. 36 00:01:46,630 --> 00:01:49,830 Une fois à l'intérieur de cet environnement, il ya deux grands commandements 37 00:01:49,830 --> 00:01:52,290 que vous aurez probablement l'utiliser dans l'ordre suivant. 38 00:01:52,290 --> 00:01:55,200 >> Le premier est b, est l'abréviation de pause. 39 00:01:55,200 --> 00:01:58,690 Et après avoir tapé b, vous avez l'habitude tapez le nom d'une fonction, 40 00:01:58,690 --> 00:02:01,040 ou si vous connaissez autour de ce numéro de ligne 41 00:02:01,040 --> 00:02:04,100 votre programme commence à se comporter un peu bizarre, 42 00:02:04,100 --> 00:02:06,370 vous pouvez taper une ligne Numéro là aussi. 43 00:02:06,370 --> 00:02:09,660 Quel b, ou pause, ne est qu'il permet à votre programme 44 00:02:09,660 --> 00:02:13,270 à courir jusqu'à un certain point, à savoir, le nom de la fonction 45 00:02:13,270 --> 00:02:15,880 que vous spécifiez ou la ligne nombre que vous spécifiez. 46 00:02:15,880 --> 00:02:18,590 >> Et à ce moment, il gèlera exécution. 47 00:02:18,590 --> 00:02:21,670 Ceci est une très bonne chose, parce que une fois l'exécution a été gelé, 48 00:02:21,670 --> 00:02:25,214 vous pouvez commencer à très lentement étape dans votre programme. 49 00:02:25,214 --> 00:02:28,130 Typiquement, si vous avez été en cours d'exécution vos programmes, ils sont assez courte. 50 00:02:28,130 --> 00:02:31,250 Habituellement, vous tapez slash dot quel que soit le nom de votre programme, appuyez sur Entrée, 51 00:02:31,250 --> 00:02:33,470 et avant que vous pouvez clignoter, votre programme est déjà terminé. 52 00:02:33,470 --> 00:02:36,620 Il est pas vraiment beaucoup de temps pour essayer et de comprendre ce qui va mal. 53 00:02:36,620 --> 00:02:40,920 Donc il vraiment d'être en mesure de ralentir les choses par la fixation d'un point de rupture avec b, 54 00:02:40,920 --> 00:02:43,040 puis marcher dans. 55 00:02:43,040 --> 00:02:46,169 >> Puis, une fois que vous avez configuré votre pause stade, vous pouvez exécuter le programme. 56 00:02:46,169 --> 00:02:47,960 Et si vous avez une arguments de ligne de commande, 57 00:02:47,960 --> 00:02:51,610 vous spécifiez ici, pas quand vous tapez le nom de votre GDB programme. 58 00:02:51,610 --> 00:02:55,980 Vous spécifiez toute la ligne de commande arguments en prenant r, ou courir, 59 00:02:55,980 --> 00:03:00,270 et puis les arguments de ligne de commande quel que soit vous avez besoin à l'intérieur de votre programme. 60 00:03:00,270 --> 00:03:03,510 Il existe un certain nombre d'autres vraiment commandes importantes et utiles 61 00:03:03,510 --> 00:03:04,970 à l'intérieur de l'environnement de PIB. 62 00:03:04,970 --> 00:03:07,540 Alors laissez-moi juste rapidement revenir sur certains d'entre eux. 63 00:03:07,540 --> 00:03:11,320 >> Le premier est n, qui est court pour la prochaine, et vous pouvez taper à côté place de n, 64 00:03:11,320 --> 00:03:12,304 deux pourrait fonctionner. 65 00:03:12,304 --> 00:03:13,470 Et il est juste le raccourci. 66 00:03:13,470 --> 00:03:17,540 Et comme vous l'avez probablement déjà obtenu utilisé pour, être en mesure de saisir les choses 67 00:03:17,540 --> 00:03:20,520 plus courte est généralement mieux. 68 00:03:20,520 --> 00:03:24,100 Et ce qu'il va faire est il va avancer un bloc de code. 69 00:03:24,100 --> 00:03:26,170 Donc, ça va aller de l'avant jusqu'à ce qu'un appel de fonction. 70 00:03:26,170 --> 00:03:28,350 Et puis, au lieu de plonger dans cette fonction 71 00:03:28,350 --> 00:03:33,130 et en passant par tous que les fonctions code, il aura juste la fonction. 72 00:03:33,130 --> 00:03:34,400 >> La fonction sera appelée. 73 00:03:34,400 --> 00:03:35,733 Il fera tout son travail est. 74 00:03:35,733 --> 00:03:38,870 Il sera de retour à une valeur la fonction qui l'a appelé. 75 00:03:38,870 --> 00:03:42,490 Et puis vous passez à la prochaine ligne de cette fonction d'appel. 76 00:03:42,490 --> 00:03:44,555 Si vous voulez à l'étape à l'intérieur de la fonction, 77 00:03:44,555 --> 00:03:46,430 lieu d'avoir juste il exécute, en particulier 78 00:03:46,430 --> 00:03:50,004 si vous pensez que le problème pourrait se trouver à l'intérieur de cette fonction, 79 00:03:50,004 --> 00:03:52,670 vous pourriez, bien sûr, mettre une pause point à l'intérieur de cette fonction. 80 00:03:52,670 --> 00:03:57,820 Ou si vous êtes déjà en cours d'exécution, vous pouvez s utiliser pour avancer d'une ligne de code. 81 00:03:57,820 --> 00:04:01,170 >> Donc, ce sera dans l'étape et plongez dans les fonctions, 82 00:04:01,170 --> 00:04:04,750 au lieu d'avoir juste la execute et continue dans la fonction 83 00:04:04,750 --> 00:04:07,380 que vous êtes dans pour le débogage. 84 00:04:07,380 --> 00:04:09,870 Si jamais vous voulez savoir la valeur d'une variable, 85 00:04:09,870 --> 00:04:12,507 vous pouvez taper p, ou Imprimer, puis le nom de la variable. 86 00:04:12,507 --> 00:04:15,090 Et qui va imprimer à vous, l'intérieur de l'environnement GDB, 87 00:04:15,090 --> 00:04:19,110 le nom de la variable, qui vous-- excuser moi-- la valeur de la variable 88 00:04:19,110 --> 00:04:20,064 que vous avez nommé. 89 00:04:20,064 --> 00:04:23,230 Si vous voulez connaître les valeurs de tous les accessible à partir de la variable locale où 90 00:04:23,230 --> 00:04:25,970 vous êtes actuellement dans votre programme, vous pouvez taper info habitants. 91 00:04:25,970 --> 00:04:28,332 Il est beaucoup plus rapide que en tapant p, puis que ce soit, 92 00:04:28,332 --> 00:04:30,540 énumérant l'ensemble des variables que vous savez exister. 93 00:04:30,540 --> 00:04:34,370 Vous pouvez taper info habitants, et il va imprimer tout pour vous. 94 00:04:34,370 --> 00:04:37,770 Ensuite, il ya BT, qui est Retour court pour Trace. 95 00:04:37,770 --> 00:04:41,680 Or, généralement, en particulier au début CS50, 96 00:04:41,680 --> 00:04:44,450 vous ne serez pas vraiment avoir l'occasion à utiliser bt ou Retour Trace, 97 00:04:44,450 --> 00:04:47,860 parce que vous n'êtes pas avoir fonctions qui appellent d'autres fonctions. 98 00:04:47,860 --> 00:04:50,450 >> Vous pourriez avoir un appel principal fonction, mais qui est probablement. 99 00:04:50,450 --> 00:04:53,199 Vous ne disposez pas de cette autre fonction appelant une autre fonction, qui 100 00:04:53,199 --> 00:04:54,880 appelle une autre fonction, et ainsi de suite. 101 00:04:54,880 --> 00:04:57,550 Mais comme vos programmes obtiennent plus complexe, et en particulier 102 00:04:57,550 --> 00:05:00,290 lorsque vous commencez à travailler avec récurrence, retraçage 103 00:05:00,290 --> 00:05:05,150 peut être un moyen très utile de vous laisser genre d'obtenir un certain contexte pour le cas où 104 00:05:05,150 --> 00:05:06,460 Je suis dans mon programme. 105 00:05:06,460 --> 00:05:10,590 Alors dites que vous avez écrit votre code, et vous savez que la principale appelle une fonction 106 00:05:10,590 --> 00:05:14,720 f, qui appelle une fonction g, ce qui appelle une fonction h. 107 00:05:14,720 --> 00:05:17,650 Nous avons donc plusieurs couches de nidification se passe ici. 108 00:05:17,650 --> 00:05:19,440 >> Si vous êtes à l'intérieur du votre environnement GDB, 109 00:05:19,440 --> 00:05:21,640 et vous savez que votre intérieur de h, mais vous oubliez 110 00:05:21,640 --> 00:05:27,210 à propos de ce que tu as à où vous soient: vous pouvez taper bt, ou de retraçage, 111 00:05:27,210 --> 00:05:32,370 et il affichera h, g, f principale, à côté d'une autre information, qui 112 00:05:32,370 --> 00:05:35,984 vous donne un indice que, principale OK appelé f, f appelé g, g appelé h, 113 00:05:35,984 --> 00:05:37,900 et voilà où je je suis actuellement dans mon programme. 114 00:05:37,900 --> 00:05:41,380 Ainsi, il peut être vraiment utile, d'autant plus que l'énigmatique-ness de GDB 115 00:05:41,380 --> 00:05:45,667 devient un peu écrasante, à de savoir exactement où sont les choses. 116 00:05:45,667 --> 00:05:48,500 Enfin, lorsque votre programme est fait, ou lorsque vous avez terminé le déboguer 117 00:05:48,500 --> 00:05:50,125 et que vous voulez prendre du recul de l'environnement GDB, 118 00:05:50,125 --> 00:05:51,940 elle permet de savoir comment sortir de celui-ci. 119 00:05:51,940 --> 00:05:55,500 Vous pouvez taper q, ou Quitter pour sortir. 120 00:05:55,500 --> 00:05:59,220 Maintenant, avant que la vidéo d'aujourd'hui Je préparais un programme bogué 121 00:05:59,220 --> 00:06:03,900 appelé buggy1, que je compilé partir d'un fichier appelé buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Comme vous vous en doutez, cette programme est en fait buggy. 123 00:06:06,500 --> 00:06:08,990 Quelque chose se passe mal quand je tente de l'exécuter. 124 00:06:08,990 --> 00:06:13,014 Maintenant, malheureusement, je inadvertance supprimé mon fichier buggy1.c, 125 00:06:13,014 --> 00:06:15,930 Donc, pour moi de comprendre ce qui va mal avec ce programme, 126 00:06:15,930 --> 00:06:18,770 Je vais avoir à utiliser GDB genre d'aveuglement, en essayant 127 00:06:18,770 --> 00:06:22,372 de naviguer à travers ce programme comprendre exactement ce qui va mal. 128 00:06:22,372 --> 00:06:24,580 Mais en utilisant seulement les outils nous avons déjà appris, 129 00:06:24,580 --> 00:06:27,700 nous pouvons à peu près la figure exactement ce qu'il est. 130 00:06:27,700 --> 00:06:30,740 Donc, nous allons la tête sur CS50 IDE et ont un regard. 131 00:06:30,740 --> 00:06:33,155 OK, donc nous sommes ici dans mon CS50 environnement IDE, 132 00:06:33,155 --> 00:06:35,697 et je zoome un peu de sorte que vous pouvez voir un peu plus. 133 00:06:35,697 --> 00:06:38,530 Dans ma fenêtre de terminal, si je liste le contenu de mon actuel directeur 134 00:06:38,530 --> 00:06:41,250 avec ls, nous verrons que je avoir un couple de fichiers source 135 00:06:41,250 --> 00:06:44,982 ici, y compris la buggy1 discuté précédemment. 136 00:06:44,982 --> 00:06:46,940 Qu'est-ce qui se passe exactement quand Je essaye et cours buggy1. 137 00:06:46,940 --> 00:06:47,773 Eh bien nous allons découvrir. 138 00:06:47,773 --> 00:06:52,510 Je tape slash dot, poussette, et je pressez Entrée. 139 00:06:52,510 --> 00:06:53,670 >> Des erreurs de segmentation. 140 00:06:53,670 --> 00:06:55,000 Ce n'est pas bien. 141 00:06:55,000 --> 00:06:57,180 Si vous vous souvenez, un segmentation fault généralement 142 00:06:57,180 --> 00:07:01,540 se produit lorsque nous accédons à la mémoire que nous ne sommes pas autorisés à toucher. 143 00:07:01,540 --> 00:07:03,820 Nous avons en quelque sorte atteint en dehors des limites 144 00:07:03,820 --> 00:07:05,995 de ce programme, la compilateur, nous a donné. 145 00:07:05,995 --> 00:07:08,310 Et donc déjà que ya une idée à garder à la boîte à outils 146 00:07:08,310 --> 00:07:10,660 que nous commençons le processus de débogage. 147 00:07:10,660 --> 00:07:13,620 Quelque chose a un peu de mal ici. 148 00:07:13,620 --> 00:07:15,935 >> Le début de tous les droits, alors laissez- l'environnement GDB 149 00:07:15,935 --> 00:07:19,030 et voir si nous pouvons comprendre exactement ce que le problème est. 150 00:07:19,030 --> 00:07:21,674 Je vais effacer mon écran, et je vais taper GDB 151 00:07:21,674 --> 00:07:24,340 à nouveau, à pénétrer dans l'environnement GDB, et le nom du programme 152 00:07:24,340 --> 00:07:27,450 que je veux pour déboguer, buggy1. 153 00:07:27,450 --> 00:07:30,182 Nous obtenons un petit message, la lecture symboles de buggy1, fait. 154 00:07:30,182 --> 00:07:32,390 Tout ce qui signifie qu'il est tiré ainsi tout le code, 155 00:07:32,390 --> 00:07:35,570 et maintenant il a été chargé dans GDB, et il est prêt à aller. 156 00:07:35,570 --> 00:07:37,140 >> Maintenant, qu'est-ce que je veux faire? 157 00:07:37,140 --> 00:07:39,130 Vous rappelez-vous ce que le première étape est typiquement 158 00:07:39,130 --> 00:07:42,540 après je suis à l'intérieur de cet environnement? 159 00:07:42,540 --> 00:07:44,540 Heureusement, vous ledit ensemble un point de rupture, parce 160 00:07:44,540 --> 00:07:46,240 en fait, qui est ce que je veux faire. 161 00:07:46,240 --> 00:07:47,990 Maintenant, je ne l'ai pas code source pour cette 162 00:07:47,990 --> 00:07:50,948 en face de moi, ce qui est probablement pas le cas d'utilisation typique, par la manière. 163 00:07:50,948 --> 00:07:52,055 Vous aurez probablement. 164 00:07:52,055 --> 00:07:52,680 Donc, ce qui est bon. 165 00:07:52,680 --> 00:07:55,790 Mais en supposant que vous ne le faites pas, ce qui est une fonction qui vous savez 166 00:07:55,790 --> 00:07:58,880 existe dans chaque programme C? 167 00:07:58,880 --> 00:08:04,420 Peu importe la taille ou la complexité il est, cette fonction existe certainement. 168 00:08:04,420 --> 00:08:05,440 Main, à droite? 169 00:08:05,440 --> 00:08:08,870 >> Donc, ne pas tout, nous pouvons définir un point principal de pause. 170 00:08:08,870 --> 00:08:12,200 Et encore, je ne pouvais tout simplement taper briser principale, au lieu de b. 171 00:08:12,200 --> 00:08:14,650 Et si vous êtes curieux, si vous jamais taper une longue commande 172 00:08:14,650 --> 00:08:16,800 et ensuite réaliser que vous tapé la mauvaise chose, 173 00:08:16,800 --> 00:08:18,770 et vous voulez vous débarrasser Tout comme je viens de le faire, 174 00:08:18,770 --> 00:08:22,029 vous pouvez prendre le contrôle U, qui sera supprimer tout et vous ramènera 175 00:08:22,029 --> 00:08:23,570 au début des lignes de curseur. 176 00:08:23,570 --> 00:08:26,569 Beaucoup plus rapide que juste maintenez la supprimer, ou de frapper un temps de botte 177 00:08:26,569 --> 00:08:27,080 plus de. 178 00:08:27,080 --> 00:08:28,740 >> Donc, nous allons définir un point de rupture au principal. 179 00:08:28,740 --> 00:08:32,970 Et comme vous pouvez le voir, il est dit que nous avons définir un point de rupture au fichier buggy1.c, 180 00:08:32,970 --> 00:08:36,330 et apparemment la première ligne du code de la ligne principale est de sept ans. 181 00:08:36,330 --> 00:08:38,080 Encore une fois, nous ne disposons pas le fichier source ici, 182 00:08:38,080 --> 00:08:40,429 mais je suppose qu'il est me dire la vérité. 183 00:08:40,429 --> 00:08:44,510 Et puis, je vais juste essayer et exécuter le programme, r. 184 00:08:44,510 --> 00:08:45,360 Démarrage du programme. 185 00:08:45,360 --> 00:08:48,160 Très bien, alors ce message est un peu cryptique. 186 00:08:48,160 --> 00:08:50,160 Mais fondamentalement, ce qui est est-ce qui se passe ici est juste 187 00:08:50,160 --> 00:08:53,350 me disant que je l'ai frappé ma pause point, point pause numéro 1. 188 00:08:53,350 --> 00:08:55,877 >> Et puis, cette ligne de code, Aucun fichier ou répertoire de ce nom. 189 00:08:55,877 --> 00:08:57,710 La seule raison pour laquelle Je vois ce message 190 00:08:57,710 --> 00:09:00,800 est parce que je inadvertance supprimé mon fichier buggy.c. 191 00:09:00,800 --> 00:09:04,050 Si mon dossier buggy1.c existait dans le répertoire courant, 192 00:09:04,050 --> 00:09:06,920 ce droit de la ligne, il serait effectivement me dire ce que la ligne de code 193 00:09:06,920 --> 00:09:08,214 lit littéralement. 194 00:09:08,214 --> 00:09:09,380 Malheureusement, je l'ai effacé. 195 00:09:09,380 --> 00:09:14,790 Nous allons avoir à type de naviguer grâce à cela un peu plus à l'aveuglette. 196 00:09:14,790 --> 00:09:17,330 >> OK, donc nous allons voir, ce ce que je veux faire ici? 197 00:09:17,330 --> 00:09:21,770 Eh bien, je voudrais savoir ce que locale peut-être les variables sont disponibles pour moi. 198 00:09:21,770 --> 00:09:23,570 Je l'ai commencé mon programme. 199 00:09:23,570 --> 00:09:28,515 Voyons voir ce qui pourrait être déjà initialisé pour nous. 200 00:09:28,515 --> 00:09:31,430 Je tape Information habitants, pas les habitants. 201 00:09:31,430 --> 00:09:33,960 Tout droit, de sorte que ne me donner une tonne d'informations. 202 00:09:33,960 --> 00:09:37,600 Je pourrais essayer et imprimer une variable, mais je ne connais pas les noms de variables. 203 00:09:37,600 --> 00:09:39,930 Je pourrais essayer une trace de dos, mais je suis à l'intérieur de la principale, 204 00:09:39,930 --> 00:09:43,710 donc je sais que je ne l'ai pas fait une autre fonction appel en ce moment. 205 00:09:43,710 --> 00:09:47,710 >> Semble tellement comme mes seules options sont à utiliser n ou deux et commencer à plonger. 206 00:09:47,710 --> 00:09:49,630 Je vais utiliser n. 207 00:09:49,630 --> 00:09:51,180 Donc je tape n. 208 00:09:51,180 --> 00:09:53,060 Oh mon Dieu, qu'est-ce qui se passe ici. 209 00:09:53,060 --> 00:09:56,260 Programme des signaux reçus, SIGSEGV segmentation fault, 210 00:09:56,260 --> 00:09:57,880 puis tout un tas de trucs. 211 00:09:57,880 --> 00:09:58,880 Je suis déjà débordés. 212 00:09:58,880 --> 00:10:00,980 Eh bien, il ya en fait une beaucoup à apprendre ici. 213 00:10:00,980 --> 00:10:02,520 Alors qu'est-ce que cela nous dit? 214 00:10:02,520 --> 00:10:09,180 Qu'est-ce qu'il nous dit est, ce programme est sur le point, mais n'a pas encore, faute seg. 215 00:10:09,180 --> 00:10:12,550 Et en particulier, je vais pour agrandir encore plus ici, 216 00:10:12,550 --> 00:10:18,980 il est sur le seg faute propos quelque chose appelé strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Maintenant, nous ne pouvons pas en avons discuté cette fonction largement. 218 00:10:22,705 --> 00:10:25,580 Mais il est-- parce que nous ne sommes pas aller pour parler de toutes les fonctions que 219 00:10:25,580 --> 00:10:28,610 existe dans le standard C library-- mais ils sont tous disponibles pour vous, 220 00:10:28,610 --> 00:10:32,110 en particulier si vous prenez un regarder reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Et strcmp est un très puissant fonction qui existe à l'intérieur 222 00:10:35,000 --> 00:10:38,070 de l'en-tête string.h fichier, ce qui est un en-tête 223 00:10:38,070 --> 00:10:41,970 fichier qui est dédié à des fonctions qui travaillent avec et manipuler des chaînes. 224 00:10:41,970 --> 00:10:49,830 >> Et en particulier, ce qui ne fait que strcmp il compare les valeurs des deux chaînes. 225 00:10:49,830 --> 00:10:54,160 Donc, je suis sur le point de segmentation fault sur un appel à strcmp il semble. 226 00:10:54,160 --> 00:10:58,530 Je frappe n, et en fait je reçois le message, programme terminé par le signal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentation fault. Alors maintenant Je l'ai fait seg en défaut, 228 00:11:01,370 --> 00:11:06,479 et mon programme a assez beaucoup efficacement renoncé. 229 00:11:06,479 --> 00:11:07,770 Ceci constitue la fin du programme. 230 00:11:07,770 --> 00:11:10,370 Il est tombé en panne, il est écrasé. 231 00:11:10,370 --> 00:11:14,740 Donc avait pas beaucoup, mais je a effectivement fait apprendre un peu 232 00:11:14,740 --> 00:11:16,747 à partir de ce peu d'expérience. 233 00:11:16,747 --> 00:11:17,580 Qu'ai-je appris? 234 00:11:17,580 --> 00:11:22,020 Eh bien, mon programme se bloque à peu près immédiatement. 235 00:11:22,020 --> 00:11:26,300 Mon programme se bloque sur Un appel à strcmp, mais je 236 00:11:26,300 --> 00:11:30,560 ne pas avoir de variables locales dans mon programme au moment où il se bloque. 237 00:11:30,560 --> 00:11:37,320 Alors quelle chaîne, ou chaînes, pourrais-je être comparer. 238 00:11:37,320 --> 00:11:42,140 Si je ne ai pas locale les variables, vous pourriez 239 00:11:42,140 --> 00:11:45,520 présume que je have-- il est peut-être un variable globale, qui pourrait être vrai. 240 00:11:45,520 --> 00:11:47,670 >> Mais en général, il semble comme je suis comparant 241 00:11:47,670 --> 00:11:52,070 à quelque chose qui ne existe pas. 242 00:11:52,070 --> 00:11:54,130 Donc, nous allons enquêter un peu plus loin. 243 00:11:54,130 --> 00:11:55,120 Donc, je vais effacer mon écran. 244 00:11:55,120 --> 00:11:57,536 Je vais arrêter de sortir de la Environnement GDB pour une seconde. 245 00:11:57,536 --> 00:12:01,300 Et je suis penser, OK, donc il n'y a pas de variables locales dans mon programme. 246 00:12:01,300 --> 00:12:06,444 Je me demande si peut-être je suis censé passer dans une chaîne comme argument de ligne de commande. 247 00:12:06,444 --> 00:12:07,610 Alors disons simplement tester ceci. 248 00:12:07,610 --> 00:12:09,020 Je ne l'ai pas fait cela avant. 249 00:12:09,020 --> 00:12:14,244 >> Voyons voir si peut-être si je exécuter ce programme avec un argument de ligne de commande cela fonctionne. 250 00:12:14,244 --> 00:12:16,140 Huh, sans aucune faute de segmentation il. 251 00:12:16,140 --> 00:12:17,870 Il m'a juste dit que je figured it out. 252 00:12:17,870 --> 00:12:19,170 Alors peut-être que ce le correctif ici. 253 00:12:19,170 --> 00:12:27,560 Et en effet, si je vais en arrière et regarder le code source réelle pour buggy1.c, 254 00:12:27,560 --> 00:12:31,180 il semble que ce que je fais est Je fais un appel à strcmp sans 255 00:12:31,180 --> 00:12:34,010 vérifier si, en fait, argv [1] existe. 256 00:12:34,010 --> 00:12:36,730 Ceci est en fait la code source pour buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Donc ce que je dois vraiment faire ici de fixer mon programme, 258 00:12:38,855 --> 00:12:40,835 en supposant que je l'ai déposer en face de moi, est 259 00:12:40,835 --> 00:12:44,740 d'ajouter simplement un chèque à faire assurer que argc est égal à 2. 260 00:12:44,740 --> 00:12:47,780 Donc cet exemple, encore une fois, comme je le disais, est un peu artificiel, non? 261 00:12:47,780 --> 00:12:49,840 Vous êtes généralement pas aller à accidentellement supprimer votre code source 262 00:12:49,840 --> 00:12:51,820 et d'avoir à essayer et déboguer le programme. 263 00:12:51,820 --> 00:12:53,120 Mais je l'espère, il a donné vous une illustration 264 00:12:53,120 --> 00:12:55,120 des sortes de choses qui vous pourriez penser à 265 00:12:55,120 --> 00:12:56,610 que vous êtes le débogage de votre programme. 266 00:12:56,610 --> 00:12:58,760 >> Quelle est la situation ici? 267 00:12:58,760 --> 00:13:00,510 Quelles sont les variables-je avoir accès à moi? 268 00:13:00,510 --> 00:13:03,600 Où est exactement mon programme écraser, sur quelle ligne, 269 00:13:03,600 --> 00:13:05,240 sur ce que l'appel à quelle fonction? 270 00:13:05,240 --> 00:13:06,952 Quel genre d'indices que cela me donner? 271 00:13:06,952 --> 00:13:08,910 Et cela est exactement la genre de mentalité que vous 272 00:13:08,910 --> 00:13:12,820 devrait être dans le moment où vous êtes penser à déboguer vos programmes. 273 00:13:12,820 --> 00:13:13,820 >> Je suis Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Ceci est CS50. 275 00:13:16,140 --> 00:15:08,642