DOUG LLOYD:すべての権利、GDB。 それは正確には何ですか? スタンドだからGDB、 GNUデバッガの、 たちができる本当に素晴らしいツールです。 我々のプログラムをデバッグする私たちを助けるために使用します、 物事がどこにあるかを調べます 我々のプログラムで間違っています。 GDBは、驚くほど強力ですが、 それとの出力との相互作用 少し不可解することができます。 これは通常、コマンドラインツールだし、 それはあなたに大量のメッセージを投げることができます。 そして、それは一種のハードにすることができます 起こって正確に何を解析します。 幸いなことに、私たちが撮影した手順 あなたのために、この問題を解決するには あなたはCS50を介して動作として。 あなたは、グラフィックを使用していない場合 デバッガ、私の同僚ダン Armandarseは非常に語られました そのビデオには約ビット こっちでなければなりません 今、あなたが必要な場合があります これらのコマンドラインを使用します GDBで作業するためのツール。 あなたはCS50で作業している場合 IDEは、あなたがこれを行う必要はありません。 しかし、あなたがいないのであれば CS50 IDEでの作業、 おそらくバージョンを使用して CS50アプライアンスの、 または別のLinuxが動作して GDBを持つシステムが、それにインストールされています あなたが使用する必要があるかもしれません これらのコマンドラインツール。 そして、あなたは可能性があるため それはですが、それをしなければなりません どれだけ理解しておくと便利 GDBは、コマンドラインから動作します。 しかし、再び、あなたがしている場合 CS50のIDEを使用して、あなた グラフィカルデバッガを使用することができます それは、IDEに組み込まれています。 だから、物事が一緒に行く取得します GDBは、デバッグを開始します 特定のプロセス プログラムは、すべてあなたが行う必要があります GDBが続くタイプです プログラム名によって。 したがって、たとえば、あなたのプログラムがある場合 こんにちは、あなたはGDBのハローを入力します。 あなたがそれを行うと、あなたが行っています GDBの環境をプルアップします。 あなたのプロンプトが変化し、 その代わり、通常、何それであることの あなたは物事を入力したときであります コマンドline--のLSで、 あなたの典型的なのすべてをcd-- Linuxは、あなたのプロンプトをコマンド おそらく、何かに変更されます 括弧のようなGDBは括弧します。 それはので、あなたの新しいGDBプロンプトです あなたは、GDBの環境の中にいます。 一度その環境の内側に、 二つの主要なコマンドがあります あなたはおそらく使用しますことを 以下のためです。 最初はBであり、これは 休憩の略です。 そして、あなたはBを、あなた通常は入力した後、 関数の名前を入力し、 またはあなたが知っているために起こる場合 何行番号の前後に あなたのプログラムが起動されます 少し奇妙な動作するように、 あなたは行を入力することができます そこに数と同様。 何B、またはブレーク、い それはあなたのプログラムを可能にしています ある時点まで実行するには、 機能のすなわち、名前 あなたが指定するか、ラインこと 指定した数。 そしてその時点で、それを 実行を凍結します。 これは、本当に良いことです 実行が凍結された後、 あなたは非常にゆっくりに始めることができます あなたのプログラムをステップ。 通常、あなたが実行してきた場合 あなたのプログラムは、彼らは非常に短いです。 通常、あなたはどのようなドットスラッシュを入力 あなたのプログラムの名前は、Enterキーを押しています、 あなたが点滅する前に、あなたの プログラムは、すでに終了しています。 それは本当にしようとする多くの時間ではありません そして、間違って何が起こっているかを把握します。 だから、本当に物事を遅くすることができるように、 ダウンBにブレークポイントを設定することにより、 そして、その後にステッピング。 次に、あなたのブレークを設定したら ポイントは、あなたがプログラムを実行することができます。 そして、あなたがいずれかを持っている場合 コマンドライン引数、 あなたは、ここでそれらを指定しない場合は あなたは、プログラム名、GDBを入力します。 あなたは、すべてのコマンドラインを指定します R、または実行を取ることによって、引数、 して、どのようなコマンドライン引数 あなたのプログラムの中に必要になります。 他の数は実際にあります 重要かつ便利なコマンド GDP環境の内部。 だからすぐに私をしましょう それらのいくつかの上に移動します。 最初は、次の略でnは、あります あなたは、次のnの代わりに入力することができます 両方が動作します。 そして、それは単に速記です。 そして、あなたはおそらくすでに得ているとして、 物事を入力することができること、に使用 短いが、一般的に良いです。 そして、何それを行うだろうと、それはよです 前方のコードのブロックを一つのステップ。 だから、前方に移動します 関数呼び出しまで。 そして、代わりに その関数に飛び込みます その機能のすべてを通過します コー​​ドは、それだけの機能を持っています。 関数が呼び出されます。 それは、その仕事があるものは何でもします。 それはに値を返します。 それを、呼び出される関数です。 そして、あなたは上に移動します その呼び出し元の関数の次の行。 あなたがステップにしたい場合 関数の内部で、 だけではなく、持っていることの それは特に、実行します あなたは、問題と思われる場合 その関数の中にあるかもしれませんが、 あなたは、もちろん、ブレークを設定することができます その関数の内部点。 すでに実行している場合、または、することができます 前方に1行のコードをステップするのに使用します。 だから、これはでステップインします 機能に飛び込みます、 だけではなく、実行してい 機能での継続 あなたはデバッグのためにしていること。 あなたは今まで知りたい場合 変数の値は、 あなたは、p、または印刷を入力することができ、 して、変数名。 そして、それは、あなたにプリントアウトされます GDBの環境の内部、 変数の名前、そのyou-- 変数の値me--言い訳 あなたが命名したこと。 あなたは、すべての値を知りたい場合は ここからローカル変数にアクセス可能 あなたが現在あなたの内にあります このプログラムは、あなたが情報の地元の人々を入力することができます。 これは、より多くの高速です 、pを入力した後、どのような のすべてを一覧表示します あなたが存在することがわかっている変数。 あなたの情報を地元の人々を入力することができ、それ あなたのためにすべてを出力します。 次はである、BTです バックトレースのために短いです。 今、一般に、 特に初期CS50で、 あなたは本当に機会がありません BT、またはバックトレースを使用するには、 あなたが機能を持っていないしているため それは他の関数を呼び出します。 あなたは、メイン・コールaを持っている可能性があります 機能が、それはおそらくそれです。 あなたは、他の機能を持っていません 別の関数を呼び出して、どの 別の関数を呼び出す、というように。 しかし、あなたのプログラムは、多くを得るよう 複雑であり、特に あなたが作業を開始するとき 再帰と、バックトレース あなたをできるように本当に便利な方法することができます 種のためのいくつかのコンテキストを取得 私は私のプログラムにしています。 だから、あなたのコードを書いていると言うと、 あなたは主に関数を呼び出すことを知っています 関数を呼び出すF、 関数hを呼び出しグラム。 だから我々はいくつかの層を持っています ここで起こってネストの。 あなたは、の中にいる場合 あなたのGDB環境、 あなたはあなたの内部を知っています hの、しかし、あなたが忘れてしまいました どこにあなたを得たかについて あなたは、BT、またはバックトレースを入力することができare--、 それは、メインF、H、Gを出力します いくつかの他の情報と一緒に、これ あなたの手掛かりを与えること、[OK]メイン 呼び出さfは、と呼ばれるG F、G、Hと呼ばれます それはどこだ私 現在、私のプログラムにしています。 だから、本当に役立つことができ、 特にGDBの不可解なネスなど に、少し圧倒的になります 物事がある場所を正確に見つけます。 最後に、あなたのプログラムが実行されたときに、 設定が完了したとき、または、それをデバッグします あなたは離れてステップにしたいです GDBの環境から、 それはそれから抜け出す方法​​を知ることができます。 あなたが外に出て、Qを入力するか、または終了することができます。 さて、今日のビデオ前 私は、バグのあるプログラムを用意しました 私はコンパイルと呼ばれるbuggy1、 buggy1.cとして知られているファイルから。 ご想像のとおり、この プログラムは、実際のバギーです。 何かがうまくいきません 私はそれを試してみて、実行するとき。 さて、残念ながら、私はうっかり 私buggy1.cファイルを削除し、 そう私が把握するためには 何がこのプログラムに間違って起こっています、 私が使用する必要がありますするつもりです GDBは一種の盲目的に、しよう このプログラムをナビゲートします 間違って起こっている正確に何を見つけ出します。 しかし、単にツールを使用して 我々はすでに、約学びました 私たちはかなり理解することができ それが正確に何をアウト。 それでは、に向かうましょう CS50 IDEと見ています。 [OK]を、私たちはここにいる私の CS50 IDE環境、 私は少しズームインます だから、もう少しを見ることができます。 私の端末ウィンドウで、私はリスト場合 私の現在の取締役の内容 lsコマンドで、私たちは、その私が表示されます ソースファイルのカップルを持っています ここで、含みます 以前buggy1について議論しました。 正確には何に行きます 私が試してみて、buggy1を実行します。 まあさんが出て見つけてもらいます。 私は、ドットスラッシュを入力 バギー、と私はEnterキーを押します。 セグメンテーションフォールト。 それはよくないのです。 あなたがリコールした場合、 セグメンテーションフォールト通常、 我々は、メモリにアクセスするときに発生します 我々は触れることは許されないことです。 我々は何とか達しました 境界の外 どのようなプログラム、 コンパイラは、私たちに与えています。 だから、すでにそれはです ツールボックスを保つために手掛かり 我々は、デバッグプロセスを開始しました。 何かがここで少し間違って行ってきました。 すべての権利、それでは始めましょう GDBの環境をバックアップ そして私たちが把握できるかどうかを確認 まさに問題があります。 私は、私の画面をクリアするつもりです 私は、GDBを入力するつもりです 再び、GDBの環境を入力し、 プログラムの名前 私は、buggy1をデバッグしたいこと。 私たちは、読書、少しメッセージが表示されます buggy1からの記号は、行って。 それが意味するすべては、それが引っ張られ、 一緒にすべてのコードを、 そして今、それがロードされていますに GDBは、それが移動する準備ができます。 今、私は何をしたいですか? あなたは何を思い出してください 最初のステップは、典型的には 私はこのような環境の中だ後? うまくいけば、あなたは上記セット ブレークポイント、理由 実際にそれは私が何をしたいです。 今、私が持っていません このソースコード 私の前に、これはおそらくです ていない典型的なユースケース、と​​ころで。 あなたは、おそらくされます。 だから、それは良いことです。 しかし、何、あなたがいないと仮定すると あなたが知っている一つの機能 一つ一つのCプログラムに存在しますか? どんなに大きなまたはどのように複雑な それは、この関数は間違いなく存在します。 メイン、右? だから我々は、他のすべてが失敗することができます 主にブレークポイントを設定します。 そして再び、私はちょうど入力することができ 代わりにBの、メイン破ります。 そして、あなたが、興味があれば、あなたの場合 これまで長いコマンドを入力します そして、あなたことを認識 間違ったことを入力、 あなたは取り除きたいです すべての私はちょうど行ったように、 あなたは、意志、コントロールUを取ることができます すべてを削除し、あなたを持ち帰ります カーソル行の先頭に。 ただ押したままよりもはるかに高速 削除、またはそれを束の時間を打ちます オーバー。 だから我々は、主にブレークポイントを設定します。 そして、あなたが見ることができるように、それは我々が書いているそうです ファイルbuggy1.cにブレークポイントを設定し、 どうやら最初の行 メインのコード行7です。 繰り返しますが、私たちは持っていません ここでは、ソースファイル、 私はそれがだと仮定します 私は真実を語って。 そして、私はちょうどしようとしています r、プログラムを実行します。 プログラムを開始しています。 すべての権利なので、このメッセージ 少し不可解です。 しかし、基本的には何が ここで起こっては、それだけだです 私は休憩をヒットしました私に言って ポイント、ブレークポイント番号1。 そして、そのコード行、 そのようなファイル、又はディレクトリはありません。 その唯一の理由 私はそのメッセージを見ています ので、私は不注意です 私buggy.cファイルを削除しました。 私buggy1.cファイルが存在していた場合 現在のディレクトリに、 その行が右実際にそこだろう 教えてどのようなコードの行 文字通り読み込みます。 残念ながら、私はそれを削除しました。 私たちは、この種の移動する必要があるとしています もう少し盲目的これを通して。 [OK]を、そう何、見てみましょう 私はここで何をしたいですか? まあ、私は地元の何を知りたいのですが 変数は多分私にご利用いただけます。 私は私のプログラムを開始しました。 のが何であるかを見てみましょう すでに私たちのために初期化されました。 私は情報の地元の人々、ない地元の人々を入力します。 すべての権利、それがないように 私は情報のトンを与えます。 私が試してみて、変数をプリントアウト可能性があり、 私は任意の変数名を知りません。 私は、バックトレースを試みることができます、 私は主の中だけど、 ので、私は行っていない知っています 今、別の関数呼び出し。 私の唯一の選択肢であるようなので、見えます nまたはそのように使用し、中にダイビングを開始します。 私は、nを使用するつもりです。 だから私は、nと入力します。 おやっ私のああ、ここで何が起こっています。 プログラムでは、受信信号を、 SIGSEGVセグメンテーションフォールト、 して、ものの全体の束。 私はすでに圧倒さです。 まあ、実際にあります ここで学んだことがたくさん。 それでは、これは私たちを教えていますか? それは何を教えてくれることは、このプログラムは、あります 約が、持っていない、まだ、ワンセグ障害。 特に、私は行きますよ さらに、ここにズームインするには、 約障害をSEGしようとしてです strcmpはと呼ばれるもの。 今、私たちが議論していない可能性があります この機能は広範囲に。 我々はつもりはないので、しかし、それはis-- そのすべての機能をについての話をします C標準に存在しますlibrary-- しかし、それらはすべて使用可能です、 特にあなたが取る場合 reference.cs50.netを見てください。 そして、strcmpのは本当に強力です 内部に存在する機能 string.hのヘッダーの ヘッダがあるファイル、 機能に専用されているファイル その仕事とは、文字列を操作します。 特に、strcmpのが何をするかであります それは、2つの文字列の値を比較します。 だから私は、障害をセグメンテーションする程度です strcmpのための呼び出しにそれはそうです。 、I nはヒット、実際に私は、メッセージが表示されます プログラム信号SIGSEGVで終了 セグメンテーションフォールト。だから今 私は実際にワンセグ障害が発生しています、 そして、私のプログラムはかなり持っています はるかに効果的にあきらめ。 これは、プログラムの終了です。 それが決裂し、それがクラッシュしました。 だから私は多くはありませんでしたが、 実際にはかなり学びました この小さな経験から。 私は何を学びましたか? まあ、私のプログラムがクラッシュ かなりすぐに。 私のプログラムは、上のクラッシュ strcmpのためのコールが、私 私の中の任意のローカル変数を持っていません それがクラッシュした時にプログラム。 それでは、文字列、または文字列、 私はおそらく比較することができました。 私は任意のローカルを持っていない場合 変数、あなたがかもしれません 多分私はそこhave--と推測 真の可能性があり、グローバル変数、。 しかし、一般的に、それはそうです 私は比較てるよう 存在しないものに。 それでは、調査しましょう 少しさらにそれ。 だから、私は画面をクリアするつもりです。 私は外に終了するつもりです 第二のためのGDBの環境。 そして、私はOK、思っているので、あります 私のプログラムにはローカル変数はありません。 多分私が合格になってるのだろうか コマンドライン引数として文字列インチ それでは、ちょうどこれを試してみましょう。 私は前にこれを行っていません。 多分場合、私はこのプログラムを実行する場合を見てみましょう コマンドライン引数でそれが動作します。 許氏は、そこにはセグメンテーションフォールト。 それはちょうど、私はそれを考え出したことを教えてくれました。 ので、多分それは、ここで修正です。 そして実際、私は戻って見れば buggy1.cための実際のソースコード、 それは私がやっていることであるかのように思われます 私はなしのstrcmpへの呼び出しを作ってるんです 実際にARGV [1]が存在するかどうかをチェックします。 これは実際にあります buggy1.cのソースコード。 だから私は本当にために必要なもの 私のプログラムを修正するためにここで行います、 私が持っていると仮定すると 私の目の前にあるファイルです ただ作るためのチェックを追加します ARGCが2に等しいことを確認してください。 したがって、この例では、再び、私が言ったように、 右、少し不自然なのですか? あなたは、一般的にするつもりはありません 誤ってソースコードを削除 して、試してみて プログラムをデバッグします。 しかし、うまくいけば、それは与えました あなたイラスト 物事の種類のもの あなたがについて考えることができました あなたはあなたのプログラムをデバッグしているよう。 ここで事態は何ですか? 私はどのような変数を行います 私がアクセスできる必要がありますか? 場所を正​​確に私のプログラムがあります 何行に、クラッシュ、 どの機能にどのような呼び出しで? 手がかりはどのようなことには、私を与えるのでしょうか? そして、それはまさに 考え方の種類あなたに あなたがいるときに取得する必要があります あなたのプログラムのデバッグを考えます。 私はダグロイドです。 これはCS50です。