1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD:すべての権利、GDB。 3 00:00:06,830 --> 00:00:08,480 それは正確には何ですか? 4 00:00:08,480 --> 00:00:11,310 スタンドだからGDB、 GNUデバッガの、 5 00:00:11,310 --> 00:00:15,040 たちができる本当に素晴らしいツールです。 我々のプログラムをデバッグする私たちを助けるために使用します、 6 00:00:15,040 --> 00:00:18,210 物事がどこにあるかを調べます 我々のプログラムで間違っています。 7 00:00:18,210 --> 00:00:22,590 GDBは、驚くほど強力ですが、 それとの出力との相互作用 8 00:00:22,590 --> 00:00:23,830 少し不可解することができます。 9 00:00:23,830 --> 00:00:28,210 これは通常、コマンドラインツールだし、 それはあなたに大量のメッセージを投げることができます。 10 00:00:28,210 --> 00:00:31,144 そして、それは一種のハードにすることができます 起こって正確に何を解析します。 11 00:00:31,144 --> 00:00:33,560 幸いなことに、私たちが撮影した手順 あなたのために、この問題を解決するには 12 00:00:33,560 --> 00:00:36,281 あなたはCS50を介して動作として。 13 00:00:36,281 --> 00:00:39,030 あなたは、グラフィックを使用していない場合 デバッガ、私の同僚ダン 14 00:00:39,030 --> 00:00:41,570 Armandarseは非常に語られました そのビデオには約ビット 15 00:00:41,570 --> 00:00:44,740 こっちでなければなりません 今、あなたが必要な場合があります 16 00:00:44,740 --> 00:00:48,270 これらのコマンドラインを使用します GDBで作業するためのツール。 17 00:00:48,270 --> 00:00:51,250 あなたはCS50で作業している場合 IDEは、あなたがこれを行う必要はありません。 18 00:00:51,250 --> 00:00:53,550 しかし、あなたがいないのであれば CS50 IDEでの作業、 19 00:00:53,550 --> 00:00:55,750 おそらくバージョンを使用して CS50アプライアンスの、 20 00:00:55,750 --> 00:00:58,860 または別のLinuxが動作して GDBを持つシステムが、それにインストールされています 21 00:00:58,860 --> 00:01:00,980 あなたが使用する必要があるかもしれません これらのコマンドラインツール。 22 00:01:00,980 --> 00:01:02,860 >> そして、あなたは可能性があるため それはですが、それをしなければなりません 23 00:01:02,860 --> 00:01:06,280 どれだけ理解しておくと便利 GDBは、コマンドラインから動作します。 24 00:01:06,280 --> 00:01:09,650 しかし、再び、あなたがしている場合 CS50のIDEを使用して、あなた 25 00:01:09,650 --> 00:01:15,400 グラフィカルデバッガを使用することができます それは、IDEに組み込まれています。 26 00:01:15,400 --> 00:01:18,750 だから、物事が一緒に行く取得します GDBは、デバッグを開始します 27 00:01:18,750 --> 00:01:21,220 特定のプロセス プログラムは、すべてあなたが行う必要があります 28 00:01:21,220 --> 00:01:23,810 GDBが続くタイプです プログラム名によって。 29 00:01:23,810 --> 00:01:28,620 したがって、たとえば、あなたのプログラムがある場合 こんにちは、あなたはGDBのハローを入力します。 30 00:01:28,620 --> 00:01:31,210 >> あなたがそれを行うと、あなたが行っています GDBの環境をプルアップします。 31 00:01:31,210 --> 00:01:33,800 あなたのプロンプトが変化し、 その代わり、通常、何それであることの 32 00:01:33,800 --> 00:01:35,841 あなたは物事を入力したときであります コマンドline--のLSで、 33 00:01:35,841 --> 00:01:38,115 あなたの典型的なのすべてをcd-- Linuxは、あなたのプロンプトをコマンド 34 00:01:38,115 --> 00:01:42,200 おそらく、何かに変更されます 括弧のようなGDBは括弧します。 35 00:01:42,200 --> 00:01:46,630 それはので、あなたの新しいGDBプロンプトです あなたは、GDBの環境の中にいます。 36 00:01:46,630 --> 00:01:49,830 一度その環境の内側に、 二つの主要なコマンドがあります 37 00:01:49,830 --> 00:01:52,290 あなたはおそらく使用しますことを 以下のためです。 38 00:01:52,290 --> 00:01:55,200 >> 最初はBであり、これは 休憩の略です。 39 00:01:55,200 --> 00:01:58,690 そして、あなたはBを、あなた通常は入力した後、 関数の名前を入力し、 40 00:01:58,690 --> 00:02:01,040 またはあなたが知っているために起こる場合 何行番号の前後に 41 00:02:01,040 --> 00:02:04,100 あなたのプログラムが起動されます 少し奇妙な動作するように、 42 00:02:04,100 --> 00:02:06,370 あなたは行を入力することができます そこに数と同様。 43 00:02:06,370 --> 00:02:09,660 何B、またはブレーク、い それはあなたのプログラムを可能にしています 44 00:02:09,660 --> 00:02:13,270 ある時点まで実行するには、 機能のすなわち、名前 45 00:02:13,270 --> 00:02:15,880 あなたが指定するか、ラインこと 指定した数。 46 00:02:15,880 --> 00:02:18,590 >> そしてその時点で、それを 実行を凍結します。 47 00:02:18,590 --> 00:02:21,670 これは、本当に良いことです 実行が凍結された後、 48 00:02:21,670 --> 00:02:25,214 あなたは非常にゆっくりに始めることができます あなたのプログラムをステップ。 49 00:02:25,214 --> 00:02:28,130 通常、あなたが実行してきた場合 あなたのプログラムは、彼らは非常に短いです。 50 00:02:28,130 --> 00:02:31,250 通常、あなたはどのようなドットスラッシュを入力 あなたのプログラムの名前は、Enterキーを押しています、 51 00:02:31,250 --> 00:02:33,470 あなたが点滅する前に、あなたの プログラムは、すでに終了しています。 52 00:02:33,470 --> 00:02:36,620 それは本当にしようとする多くの時間ではありません そして、間違って何が起こっているかを把握します。 53 00:02:36,620 --> 00:02:40,920 だから、本当に物事を遅くすることができるように、 ダウンBにブレークポイントを設定することにより、 54 00:02:40,920 --> 00:02:43,040 そして、その後にステッピング。 55 00:02:43,040 --> 00:02:46,169 >> 次に、あなたのブレークを設定したら ポイントは、あなたがプログラムを実行することができます。 56 00:02:46,169 --> 00:02:47,960 そして、あなたがいずれかを持っている場合 コマンドライン引数、 57 00:02:47,960 --> 00:02:51,610 あなたは、ここでそれらを指定しない場合は あなたは、プログラム名、GDBを入力します。 58 00:02:51,610 --> 00:02:55,980 あなたは、すべてのコマンドラインを指定します R、または実行を取ることによって、引数、 59 00:02:55,980 --> 00:03:00,270 して、どのようなコマンドライン引数 あなたのプログラムの中に必要になります。 60 00:03:00,270 --> 00:03:03,510 他の数は実際にあります 重要かつ便利なコマンド 61 00:03:03,510 --> 00:03:04,970 GDP環境の内部。 62 00:03:04,970 --> 00:03:07,540 だからすぐに私をしましょう それらのいくつかの上に移動します。 63 00:03:07,540 --> 00:03:11,320 >> 最初は、次の略でnは、あります あなたは、次のnの代わりに入力することができます 64 00:03:11,320 --> 00:03:12,304 両方が動作します。 65 00:03:12,304 --> 00:03:13,470 そして、それは単に速記です。 66 00:03:13,470 --> 00:03:17,540 そして、あなたはおそらくすでに得ているとして、 物事を入力することができること、に使用 67 00:03:17,540 --> 00:03:20,520 短いが、一般的に良いです。 68 00:03:20,520 --> 00:03:24,100 そして、何それを行うだろうと、それはよです 前方のコードのブロックを一つのステップ。 69 00:03:24,100 --> 00:03:26,170 だから、前方に移動します 関数呼び出しまで。 70 00:03:26,170 --> 00:03:28,350 そして、代わりに その関数に飛び込みます 71 00:03:28,350 --> 00:03:33,130 その機能のすべてを通過します コー​​ドは、それだけの機能を持っています。 72 00:03:33,130 --> 00:03:34,400 >> 関数が呼び出されます。 73 00:03:34,400 --> 00:03:35,733 それは、その仕事があるものは何でもします。 74 00:03:35,733 --> 00:03:38,870 それはに値を返します。 それを、呼び出される関数です。 75 00:03:38,870 --> 00:03:42,490 そして、あなたは上に移動します その呼び出し元の関数の次の行。 76 00:03:42,490 --> 00:03:44,555 あなたがステップにしたい場合 関数の内部で、 77 00:03:44,555 --> 00:03:46,430 だけではなく、持っていることの それは特に、実行します 78 00:03:46,430 --> 00:03:50,004 あなたは、問題と思われる場合 その関数の中にあるかもしれませんが、 79 00:03:50,004 --> 00:03:52,670 あなたは、もちろん、ブレークを設定することができます その関数の内部点。 80 00:03:52,670 --> 00:03:57,820 すでに実行している場合、または、することができます 前方に1行のコードをステップするのに使用します。 81 00:03:57,820 --> 00:04:01,170 >> だから、これはでステップインします 機能に飛び込みます、 82 00:04:01,170 --> 00:04:04,750 だけではなく、実行してい 機能での継続 83 00:04:04,750 --> 00:04:07,380 あなたはデバッグのためにしていること。 84 00:04:07,380 --> 00:04:09,870 あなたは今まで知りたい場合 変数の値は、 85 00:04:09,870 --> 00:04:12,507 あなたは、p、または印刷を入力することができ、 して、変数名。 86 00:04:12,507 --> 00:04:15,090 そして、それは、あなたにプリントアウトされます GDBの環境の内部、 87 00:04:15,090 --> 00:04:19,110 変数の名前、そのyou-- 変数の値me--言い訳 88 00:04:19,110 --> 00:04:20,064 あなたが命名したこと。 89 00:04:20,064 --> 00:04:23,230 あなたは、すべての値を知りたい場合は ここからローカル変数にアクセス可能 90 00:04:23,230 --> 00:04:25,970 あなたが現在あなたの内にあります このプログラムは、あなたが情報の地元の人々を入力することができます。 91 00:04:25,970 --> 00:04:28,332 これは、より多くの高速です 、pを入力した後、どのような 92 00:04:28,332 --> 00:04:30,540 のすべてを一覧表示します あなたが存在することがわかっている変数。 93 00:04:30,540 --> 00:04:34,370 あなたの情報を地元の人々を入力することができ、それ あなたのためにすべてを出力します。 94 00:04:34,370 --> 00:04:37,770 次はである、BTです バックトレースのために短いです。 95 00:04:37,770 --> 00:04:41,680 今、一般に、 特に初期CS50で、 96 00:04:41,680 --> 00:04:44,450 あなたは本当に機会がありません BT、またはバックトレースを使用するには、 97 00:04:44,450 --> 00:04:47,860 あなたが機能を持っていないしているため それは他の関数を呼び出します。 98 00:04:47,860 --> 00:04:50,450 >> あなたは、メイン・コールaを持っている可能性があります 機能が、それはおそらくそれです。 99 00:04:50,450 --> 00:04:53,199 あなたは、他の機能を持っていません 別の関数を呼び出して、どの 100 00:04:53,199 --> 00:04:54,880 別の関数を呼び出す、というように。 101 00:04:54,880 --> 00:04:57,550 しかし、あなたのプログラムは、多くを得るよう 複雑であり、特に 102 00:04:57,550 --> 00:05:00,290 あなたが作業を開始するとき 再帰と、バックトレース 103 00:05:00,290 --> 00:05:05,150 あなたをできるように本当に便利な方法することができます 種のためのいくつかのコンテキストを取得 104 00:05:05,150 --> 00:05:06,460 私は私のプログラムにしています。 105 00:05:06,460 --> 00:05:10,590 だから、あなたのコードを書いていると言うと、 あなたは主に関数を呼び出すことを知っています 106 00:05:10,590 --> 00:05:14,720 関数を呼び出すF、 関数hを呼び出しグラム。 107 00:05:14,720 --> 00:05:17,650 だから我々はいくつかの層を持っています ここで起こってネストの。 108 00:05:17,650 --> 00:05:19,440 >> あなたは、の中にいる場合 あなたのGDB環境、 109 00:05:19,440 --> 00:05:21,640 あなたはあなたの内部を知っています hの、しかし、あなたが忘れてしまいました 110 00:05:21,640 --> 00:05:27,210 どこにあなたを得たかについて あなたは、BT、またはバックトレースを入力することができare--、 111 00:05:27,210 --> 00:05:32,370 それは、メインF、H、Gを出力します いくつかの他の情報と一緒に、これ 112 00:05:32,370 --> 00:05:35,984 あなたの手掛かりを与えること、[OK]メイン 呼び出さfは、と呼ばれるG F、G、Hと呼ばれます 113 00:05:35,984 --> 00:05:37,900 それはどこだ私 現在、私のプログラムにしています。 114 00:05:37,900 --> 00:05:41,380 だから、本当に役立つことができ、 特にGDBの不可解なネスなど 115 00:05:41,380 --> 00:05:45,667 に、少し圧倒的になります 物事がある場所を正確に見つけます。 116 00:05:45,667 --> 00:05:48,500 最後に、あなたのプログラムが実行されたときに、 設定が完了したとき、または、それをデバッグします 117 00:05:48,500 --> 00:05:50,125 あなたは離れてステップにしたいです GDBの環境から、 118 00:05:50,125 --> 00:05:51,940 それはそれから抜け出す方法​​を知ることができます。 119 00:05:51,940 --> 00:05:55,500 あなたが外に出て、Qを入力するか、または終了することができます。 120 00:05:55,500 --> 00:05:59,220 さて、今日のビデオ前 私は、バグのあるプログラムを用意しました 121 00:05:59,220 --> 00:06:03,900 私はコンパイルと呼ばれるbuggy1、 buggy1.cとして知られているファイルから。 122 00:06:03,900 --> 00:06:06,500 ご想像のとおり、この プログラムは、実際のバギーです。 123 00:06:06,500 --> 00:06:08,990 何かがうまくいきません 私はそれを試してみて、実行するとき。 124 00:06:08,990 --> 00:06:13,014 さて、残念ながら、私はうっかり 私buggy1.cファイルを削除し、 125 00:06:13,014 --> 00:06:15,930 そう私が把握するためには 何がこのプログラムに間違って起こっています、 126 00:06:15,930 --> 00:06:18,770 私が使用する必要がありますするつもりです GDBは一種の盲目的に、しよう 127 00:06:18,770 --> 00:06:22,372 このプログラムをナビゲートします 間違って起こっている正確に何を見つけ出します。 128 00:06:22,372 --> 00:06:24,580 しかし、単にツールを使用して 我々はすでに、約学びました 129 00:06:24,580 --> 00:06:27,700 私たちはかなり理解することができ それが正確に何をアウト。 130 00:06:27,700 --> 00:06:30,740 それでは、に向かうましょう CS50 IDEと見ています。 131 00:06:30,740 --> 00:06:33,155 [OK]を、私たちはここにいる私の CS50 IDE環境、 132 00:06:33,155 --> 00:06:35,697 私は少しズームインます だから、もう少しを見ることができます。 133 00:06:35,697 --> 00:06:38,530 私の端末ウィンドウで、私はリスト場合 私の現在の取締役の内容 134 00:06:38,530 --> 00:06:41,250 lsコマンドで、私たちは、その私が表示されます ソースファイルのカップルを持っています 135 00:06:41,250 --> 00:06:44,982 ここで、含みます 以前buggy1について議論しました。 136 00:06:44,982 --> 00:06:46,940 正確には何に行きます 私が試してみて、buggy1を実行します。 137 00:06:46,940 --> 00:06:47,773 まあさんが出て見つけてもらいます。 138 00:06:47,773 --> 00:06:52,510 私は、ドットスラッシュを入力 バギー、と私はEnterキーを押します。 139 00:06:52,510 --> 00:06:53,670 >> セグメンテーションフォールト。 140 00:06:53,670 --> 00:06:55,000 それはよくないのです。 141 00:06:55,000 --> 00:06:57,180 あなたがリコールした場合、 セグメンテーションフォールト通常、 142 00:06:57,180 --> 00:07:01,540 我々は、メモリにアクセスするときに発生します 我々は触れることは許されないことです。 143 00:07:01,540 --> 00:07:03,820 我々は何とか達しました 境界の外 144 00:07:03,820 --> 00:07:05,995 どのようなプログラム、 コンパイラは、私たちに与えています。 145 00:07:05,995 --> 00:07:08,310 だから、すでにそれはです ツールボックスを保つために手掛かり 146 00:07:08,310 --> 00:07:10,660 我々は、デバッグプロセスを開始しました。 147 00:07:10,660 --> 00:07:13,620 何かがここで少し間違って行ってきました。 148 00:07:13,620 --> 00:07:15,935 >> すべての権利、それでは始めましょう GDBの環境をバックアップ 149 00:07:15,935 --> 00:07:19,030 そして私たちが把握できるかどうかを確認 まさに問題があります。 150 00:07:19,030 --> 00:07:21,674 私は、私の画面をクリアするつもりです 私は、GDBを入力するつもりです 151 00:07:21,674 --> 00:07:24,340 再び、GDBの環境を入力し、 プログラムの名前 152 00:07:24,340 --> 00:07:27,450 私は、buggy1をデバッグしたいこと。 153 00:07:27,450 --> 00:07:30,182 私たちは、読書、少しメッセージが表示されます buggy1からの記号は、行って。 154 00:07:30,182 --> 00:07:32,390 それが意味するすべては、それが引っ張られ、 一緒にすべてのコードを、 155 00:07:32,390 --> 00:07:35,570 そして今、それがロードされていますに GDBは、それが移動する準備ができます。 156 00:07:35,570 --> 00:07:37,140 >> 今、私は何をしたいですか? 157 00:07:37,140 --> 00:07:39,130 あなたは何を思い出してください 最初のステップは、典型的には 158 00:07:39,130 --> 00:07:42,540 私はこのような環境の中だ後? 159 00:07:42,540 --> 00:07:44,540 うまくいけば、あなたは上記セット ブレークポイント、理由 160 00:07:44,540 --> 00:07:46,240 実際にそれは私が何をしたいです。 161 00:07:46,240 --> 00:07:47,990 今、私が持っていません このソースコード 162 00:07:47,990 --> 00:07:50,948 私の前に、これはおそらくです ていない典型的なユースケース、と​​ころで。 163 00:07:50,948 --> 00:07:52,055 あなたは、おそらくされます。 164 00:07:52,055 --> 00:07:52,680 だから、それは良いことです。 165 00:07:52,680 --> 00:07:55,790 しかし、何、あなたがいないと仮定すると あなたが知っている一つの機能 166 00:07:55,790 --> 00:07:58,880 一つ一つのCプログラムに存在しますか? 167 00:07:58,880 --> 00:08:04,420 どんなに大きなまたはどのように複雑な それは、この関数は間違いなく存在します。 168 00:08:04,420 --> 00:08:05,440 メイン、右? 169 00:08:05,440 --> 00:08:08,870 >> だから我々は、他のすべてが失敗することができます 主にブレークポイントを設定します。 170 00:08:08,870 --> 00:08:12,200 そして再び、私はちょうど入力することができ 代わりにBの、メイン破ります。 171 00:08:12,200 --> 00:08:14,650 そして、あなたが、興味があれば、あなたの場合 これまで長いコマンドを入力します 172 00:08:14,650 --> 00:08:16,800 そして、あなたことを認識 間違ったことを入力、 173 00:08:16,800 --> 00:08:18,770 あなたは取り除きたいです すべての私はちょうど行ったように、 174 00:08:18,770 --> 00:08:22,029 あなたは、意志、コントロールUを取ることができます すべてを削除し、あなたを持ち帰ります 175 00:08:22,029 --> 00:08:23,570 カーソル行の先頭に。 176 00:08:23,570 --> 00:08:26,569 ただ押したままよりもはるかに高速 削除、またはそれを束の時間を打ちます 177 00:08:26,569 --> 00:08:27,080 オーバー。 178 00:08:27,080 --> 00:08:28,740 >> だから我々は、主にブレークポイントを設定します。 179 00:08:28,740 --> 00:08:32,970 そして、あなたが見ることができるように、それは我々が書いているそうです ファイルbuggy1.cにブレークポイントを設定し、 180 00:08:32,970 --> 00:08:36,330 どうやら最初の行 メインのコード行7です。 181 00:08:36,330 --> 00:08:38,080 繰り返しますが、私たちは持っていません ここでは、ソースファイル、 182 00:08:38,080 --> 00:08:40,429 私はそれがだと仮定します 私は真実を語って。 183 00:08:40,429 --> 00:08:44,510 そして、私はちょうどしようとしています r、プログラムを実行します。 184 00:08:44,510 --> 00:08:45,360 プログラムを開始しています。 185 00:08:45,360 --> 00:08:48,160 すべての権利なので、このメッセージ 少し不可解です。 186 00:08:48,160 --> 00:08:50,160 しかし、基本的には何が ここで起こっては、それだけだです 187 00:08:50,160 --> 00:08:53,350 私は休憩をヒットしました私に言って ポイント、ブレークポイント番号1。 188 00:08:53,350 --> 00:08:55,877 >> そして、そのコード行、 そのようなファイル、又はディレクトリはありません。 189 00:08:55,877 --> 00:08:57,710 その唯一の理由 私はそのメッセージを見ています 190 00:08:57,710 --> 00:09:00,800 ので、私は不注意です 私buggy.cファイルを削除しました。 191 00:09:00,800 --> 00:09:04,050 私buggy1.cファイルが存在していた場合 現在のディレクトリに、 192 00:09:04,050 --> 00:09:06,920 その行が右実際にそこだろう 教えてどのようなコードの行 193 00:09:06,920 --> 00:09:08,214 文字通り読み込みます。 194 00:09:08,214 --> 00:09:09,380 残念ながら、私はそれを削除しました。 195 00:09:09,380 --> 00:09:14,790 私たちは、この種の移動する必要があるとしています もう少し盲目的これを通して。 196 00:09:14,790 --> 00:09:17,330 >> [OK]を、そう何、見てみましょう 私はここで何をしたいですか? 197 00:09:17,330 --> 00:09:21,770 まあ、私は地元の何を知りたいのですが 変数は多分私にご利用いただけます。 198 00:09:21,770 --> 00:09:23,570 私は私のプログラムを開始しました。 199 00:09:23,570 --> 00:09:28,515 のが何であるかを見てみましょう すでに私たちのために初期化されました。 200 00:09:28,515 --> 00:09:31,430 私は情報の地元の人々、ない地元の人々を入力します。 201 00:09:31,430 --> 00:09:33,960 すべての権利、それがないように 私は情報のトンを与えます。 202 00:09:33,960 --> 00:09:37,600 私が試してみて、変数をプリントアウト可能性があり、 私は任意の変数名を知りません。 203 00:09:37,600 --> 00:09:39,930 私は、バックトレースを試みることができます、 私は主の中だけど、 204 00:09:39,930 --> 00:09:43,710 ので、私は行っていない知っています 今、別の関数呼び出し。 205 00:09:43,710 --> 00:09:47,710 >> 私の唯一の選択肢であるようなので、見えます nまたはそのように使用し、中にダイビングを開始します。 206 00:09:47,710 --> 00:09:49,630 私は、nを使用するつもりです。 207 00:09:49,630 --> 00:09:51,180 だから私は、nと入力します。 208 00:09:51,180 --> 00:09:53,060 おやっ私のああ、ここで何が起こっています。 209 00:09:53,060 --> 00:09:56,260 プログラムでは、受信信号を、 SIGSEGVセグメンテーションフォールト、 210 00:09:56,260 --> 00:09:57,880 して、ものの全体の束。 211 00:09:57,880 --> 00:09:58,880 私はすでに圧倒さです。 212 00:09:58,880 --> 00:10:00,980 まあ、実際にあります ここで学んだことがたくさん。 213 00:10:00,980 --> 00:10:02,520 それでは、これは私たちを教えていますか? 214 00:10:02,520 --> 00:10:09,180 それは何を教えてくれることは、このプログラムは、あります 約が、持っていない、まだ、ワンセグ障害。 215 00:10:09,180 --> 00:10:12,550 特に、私は行きますよ さらに、ここにズームインするには、 216 00:10:12,550 --> 00:10:18,980 約障害をSEGしようとしてです strcmpはと呼ばれるもの。 217 00:10:18,980 --> 00:10:22,705 >> 今、私たちが議論していない可能性があります この機能は広範囲に。 218 00:10:22,705 --> 00:10:25,580 我々はつもりはないので、しかし、それはis-- そのすべての機能をについての話をします 219 00:10:25,580 --> 00:10:28,610 C標準に存在しますlibrary-- しかし、それらはすべて使用可能です、 220 00:10:28,610 --> 00:10:32,110 特にあなたが取る場合 reference.cs50.netを見てください。 221 00:10:32,110 --> 00:10:35,000 そして、strcmpのは本当に強力です 内部に存在する機能 222 00:10:35,000 --> 00:10:38,070 string.hのヘッダーの ヘッダがあるファイル、 223 00:10:38,070 --> 00:10:41,970 機能に専用されているファイル その仕事とは、文字列を操作します。 224 00:10:41,970 --> 00:10:49,830 >> 特に、strcmpのが何をするかであります それは、2つの文字列の値を比較します。 225 00:10:49,830 --> 00:10:54,160 だから私は、障害をセグメンテーションする程度です strcmpのための呼び出しにそれはそうです。 226 00:10:54,160 --> 00:10:58,530 、I nはヒット、実際に私は、メッセージが表示されます プログラム信号SIGSEGVで終了 227 00:10:58,530 --> 00:11:01,370 セグメンテーションフォールト。だから今 私は実際にワンセグ障害が発生しています、 228 00:11:01,370 --> 00:11:06,479 そして、私のプログラムはかなり持っています はるかに効果的にあきらめ。 229 00:11:06,479 --> 00:11:07,770 これは、プログラムの終了です。 230 00:11:07,770 --> 00:11:10,370 それが決裂し、それがクラッシュしました。 231 00:11:10,370 --> 00:11:14,740 だから私は多くはありませんでしたが、 実際にはかなり学びました 232 00:11:14,740 --> 00:11:16,747 この小さな経験から。 233 00:11:16,747 --> 00:11:17,580 私は何を学びましたか? 234 00:11:17,580 --> 00:11:22,020 まあ、私のプログラムがクラッシュ かなりすぐに。 235 00:11:22,020 --> 00:11:26,300 私のプログラムは、上のクラッシュ strcmpのためのコールが、私 236 00:11:26,300 --> 00:11:30,560 私の中の任意のローカル変数を持っていません それがクラッシュした時にプログラム。 237 00:11:30,560 --> 00:11:37,320 それでは、文字列、または文字列、 私はおそらく比較することができました。 238 00:11:37,320 --> 00:11:42,140 私は任意のローカルを持っていない場合 変数、あなたがかもしれません 239 00:11:42,140 --> 00:11:45,520 多分私はそこhave--と推測 真の可能性があり、グローバル変数、。 240 00:11:45,520 --> 00:11:47,670 >> しかし、一般的に、それはそうです 私は比較てるよう 241 00:11:47,670 --> 00:11:52,070 存在しないものに。 242 00:11:52,070 --> 00:11:54,130 それでは、調査しましょう 少しさらにそれ。 243 00:11:54,130 --> 00:11:55,120 だから、私は画面をクリアするつもりです。 244 00:11:55,120 --> 00:11:57,536 私は外に終了するつもりです 第二のためのGDBの環境。 245 00:11:57,536 --> 00:12:01,300 そして、私はOK、思っているので、あります 私のプログラムにはローカル変数はありません。 246 00:12:01,300 --> 00:12:06,444 多分私が合格になってるのだろうか コマンドライン引数として文字列インチ 247 00:12:06,444 --> 00:12:07,610 それでは、ちょうどこれを試してみましょう。 248 00:12:07,610 --> 00:12:09,020 私は前にこれを行っていません。 249 00:12:09,020 --> 00:12:14,244 >> 多分場合、私はこのプログラムを実行する場合を見てみましょう コマンドライン引数でそれが動作します。 250 00:12:14,244 --> 00:12:16,140 許氏は、そこにはセグメンテーションフォールト。 251 00:12:16,140 --> 00:12:17,870 それはちょうど、私はそれを考え出したことを教えてくれました。 252 00:12:17,870 --> 00:12:19,170 ので、多分それは、ここで修正です。 253 00:12:19,170 --> 00:12:27,560 そして実際、私は戻って見れば buggy1.cための実際のソースコード、 254 00:12:27,560 --> 00:12:31,180 それは私がやっていることであるかのように思われます 私はなしのstrcmpへの呼び出しを作ってるんです 255 00:12:31,180 --> 00:12:34,010 実際にARGV [1]が存在するかどうかをチェックします。 256 00:12:34,010 --> 00:12:36,730 これは実際にあります buggy1.cのソースコード。 257 00:12:36,730 --> 00:12:38,855 だから私は本当にために必要なもの 私のプログラムを修正するためにここで行います、 258 00:12:38,855 --> 00:12:40,835 私が持っていると仮定すると 私の目の前にあるファイルです 259 00:12:40,835 --> 00:12:44,740 ただ作るためのチェックを追加します ARGCが2に等しいことを確認してください。 260 00:12:44,740 --> 00:12:47,780 したがって、この例では、再び、私が言ったように、 右、少し不自然なのですか? 261 00:12:47,780 --> 00:12:49,840 あなたは、一般的にするつもりはありません 誤ってソースコードを削除 262 00:12:49,840 --> 00:12:51,820 して、試してみて プログラムをデバッグします。 263 00:12:51,820 --> 00:12:53,120 しかし、うまくいけば、それは与えました あなたイラスト 264 00:12:53,120 --> 00:12:55,120 物事の種類のもの あなたがについて考えることができました 265 00:12:55,120 --> 00:12:56,610 あなたはあなたのプログラムをデバッグしているよう。 266 00:12:56,610 --> 00:12:58,760 >> ここで事態は何ですか? 267 00:12:58,760 --> 00:13:00,510 私はどのような変数を行います 私がアクセスできる必要がありますか? 268 00:13:00,510 --> 00:13:03,600 場所を正​​確に私のプログラムがあります 何行に、クラッシュ、 269 00:13:03,600 --> 00:13:05,240 どの機能にどのような呼び出しで? 270 00:13:05,240 --> 00:13:06,952 手がかりはどのようなことには、私を与えるのでしょうか? 271 00:13:06,952 --> 00:13:08,910 そして、それはまさに 考え方の種類あなたに 272 00:13:08,910 --> 00:13:12,820 あなたがいるときに取得する必要があります あなたのプログラムのデバッグを考えます。 273 00:13:12,820 --> 00:13:13,820 >> 私はダグロイドです。 274 00:13:13,820 --> 00:13:16,140 これはCS50です。 275 00:13:16,140 --> 00:15:08,642