Placeholder Image

字幕表 動画を再生する

  • DAN ARMENDARIZ: Hi.

    DANアルメンダリス:こんにちは。

  • I'm Dan Armendariz .

    私はダンアルメンダリスです。

  • Today we're going to be looking at debugging.

    今日はあることになるだろう デバッグを見て。

  • Not only are we going to talk about some techniques,

    だけでなく、我々がしようとしています いくつかのテクニックについて話します、

  • but also we're going to look at some of the features contained

    だけでなく、我々が見てするつもりです 特徴のいくつかを含有

  • within the CS50 IDE that allow you to easily debug a program.

    許可CS50のIDE内で あなたは簡単にプログラムをデバッグします。

  • >> Just one example of something that can go wrong,

    >> のほんの一例 間違って行くことができるもの、

  • and it's actually something that we've already seen before.

    それは実際に何か 我々は既に前に見たこと。

  • In this case, this is a C program that accepts an integer from the user,

    この場合、これは、Cプログラムであります すなわち、ユーザからの整数を受け付け

  • divides it by 2, and provides the output back to the user.

    2で除算し、提供 バックユーザに出力。

  • Now, from what we've seen earlier in lectures,

    今、私たちがしてきたことから、 以前の講義で見られ、

  • we know that this will actually cause specific types of division problems

    私たちは、これが実際に原因となりますことを知っています 分割問題の特定のタイプ

  • when we have odd numbers.

    私たちは、奇数を持っている場合。

  • Specifically, it will just throw away anything after the decimal point.

    具体的には、それだけで捨てるます 小数点以下のもの。

  • >> Now, we know that this happens to be the case.

    >> 今、私たちはこのことを知っています ケースであることを起こります。

  • And if we run it we can confirm our suspicions first by compiling

    そして、我々はそれを実行した場合、我々は確認することができます コンパイルによる最初の私たちの疑惑

  • and then by running and entering an odd number.

    して、実行して、と 奇数番号を入力します。

  • This is nothing new, but this is actually

    これは、新しいものではありません これは実際には

  • an example of a bug that can exist within a larger program that

    バグの例することができます より大きなプログラム内に存在すること

  • becomes harder to track down.

    追跡が困難になります。

  • Even though we know what the issue is, the true crux of the matter

    私たちはどのような問題を知っているにもかかわらず 、問題の真の核心であります

  • might be trying to identify specifically where the error occurs,

    識別しようとしている可能性があります 具体的にどこでエラーが発生し、

  • identifying what that problem is, and then fixing it.

    何その問題を特定します であり、そしてそれを固定します。

  • So I provide this as an example of what might be something

    だから私は、例としてこれを提供 何かが何であるかの

  • that we already know but can be buried within other elements of the code.

    我々はすでに知っているが、埋め込むことができること コー​​ドの他の要素の中。

  • >> So opening this other source code file as an example,

    >> したがって、この他のソースを開きます 例として、コードファイル、

  • this division problem is now part of a larger program.

    この部門の問題は今あります 大きなプログラムの一部。

  • Still might be a little bit contrived and we

    まだ少しあるかもしれません ビット不自然と我々

  • might be able to easily identify it, especially

    簡単にすることができるかもしれません 特に、それを識別

  • since we were just discussing this, but we

    私達はちょうどだったので、 我々はこれを議論するが、

  • can figure out that this problem can exist on a larger scale.

    この問題ことを把握することができます より大きな規模で存在することができます。

  • If I compile this and now run it, enter an odd number,

    私は今、これをコンパイルした場合 それを実行し、奇数番号を入力し、

  • we can see that we don't get precisely the output that we may have expected.

    我々は正確に取得しないことがわかります 我々が期待している可能性があり、出力。

  • In this particular case, we might say that we

    この特定の場合において、 我々は、我々が言うかもしれません

  • want to count all the numbers from 1 up to some specific number.

    すべての数字をカウントします 1からいくつかの特定の数まで。

  • And we can see that we have a variety of issues

    そして、我々は、我々を見ることができます さまざまな問題を持っています

  • here if we're putting simply 0 and 1 when we provide an input of 5.

    ここでは、単に0とを入れている場合 1私たちは5の入力を提供します。

  • >> So we already know that there's a problem here.

    >> だから我々はすでに知っていること ここでの問題があります。

  • But we may not know precisely where this issue actually exists.

    しかし、我々は正確には知らないかもしれません この問題は、実際に存在する場合。

  • Now, one of the ways that we can try to fix this

    さて、次のいずれかの方法こと 我々はこの問題を解決しようとすることができます

  • is something that we've already been introduced to,

    私たちがきたものです 既にするために導入され、

  • we can just use it on a larger scale.

    私たちは大規模にそれを使用することができます。

  • On line 14 we have this printf function which

    14行目では、我々はこれを持っています printf関数します

  • allows us to print out the state of various pieces of information.

    私たちは状態をプリントアウトすることができます 各種情報の。

  • And this is something that you should leverage within your program

    そして、これは何かであることを プログラム内で利用してください

  • to try to figure out exactly what's happening in various lines of code.

    です正確に何を把握しようとします コー​​ドの様々なラインで起こっ。

  • >> So even if this is not the final output that we actually

    >> これはない場合であっても 最終的な出力実際に我々

  • want to produce out of this program, we still

    外に演出したいです このプログラム、まだ我々

  • might have some debug statements where we

    いくつかのデバッグを持っている可能性があります ステートメントたち

  • can try to figure out precisely what is happening inside of our code.

    正確に何を把握しようとすることができます 我々のコードの内部で起こっています。

  • So in this case I will printf with a debug tag.

    したがって、この場合、私はなります デバッグタグが付けられたのprintf。

  • In this case this is just a debug string that I'm

    この場合、これはただです 私は、デバッグ文字列

  • outputting so that it becomes very clear in the output of my code

    それは非常になるように出力します 私のコードの出力で明らかに

  • what it is that I want to show.

    何それは私が表示したいということです。

  • And output here, the number that we have computed.

    そして、ここで出力、数 我々が計算されていること。

  • >> In this case, I might want to know precisely what is happening

    >> この場合、私がしたいことがあります 正確に何が起こっているか知っています

  • before and after some specific computation

    前と後のいくつかの 具体的な計算

  • so I might use a printf before and after that line of code.

    私は前のprintfを使用する場合があります そのコード行の後。

  • In this case I could even make it a little bit more clear

    この場合、私も作ることができます それもう少し明確に

  • by saying debug before and debug after so

    前にデバッグを言って デバッグ後にそう

  • that I don't confuse myself with multiple lines that look identical.

    私は自分自身を混同しないこと 同じに見える複数の行。

  • Now, if we recompile this and run it, enter a number like 5 again,

    今、私たちは、このファイル名を指定して実行を再コンパイルする場合 それは、再び5のように番号を入力し、

  • we can see that we have now output before and after

    我々は持っていることがわかります 今の前と後の出力

  • and find that we have not done a clear division or a clear having

    私たちは行っていないことがわかります 明確な部門または有する透明

  • of the number that we actually want to do.

    私たちの数の 実際にやってみたいです。

  • >> Now, in this case, this is not really a clear output.

    >> 今、この場合、これは 本当にクリア出力。

  • It's not really a clear outcome that we want out of this particular program.

    それは本当に明確な結果ではないこと 我々は、この特定のプログラムの外にしたいです。

  • And this is, again, a little bit contrived.

    そして、これは、再び、あります 少し不自然。

  • But perhaps one of the things that we could

    しかし、おそらく1 物事我々はできます

  • do if the specification said that we want to divide this by 2

    仕様が言った場合の対処 我々は2で、これを分割したいこと

  • and add 1-- so in other words, we want to round up--

    およびその他でそう1--追加 言葉は、私たちはup--丸めます

  • then we might know that we could do that particular thing in this case.

    その後、我々は我々が行うことができることを知っているかもしれません この場合、その特定の事。

  • >> Now, here we know that we will be able to add 1 to our halved number.

    >> さて、ここで我々はなりますことを知っています 私たちの半分の数に1を追加すること。

  • Let's recompile this and confirm that this

    それでは、これを再コンパイルしてみましょう このことを確認します

  • is behaving the way that we want to.

    我々が望むように動作しています。

  • We can see that now before having we have the number 5,

    私たちは今、前にそれを見ることができます 私たちは数5を持っていました、

  • after having we have the number 3.

    した後、我々は数3を持っています。

  • Which, according to our specification, is what we wanted to do.

    どの、私たちの仕様に応じて、 私たちがやりたいことです。

  • But if we look at the output here we can see

    しかし、私たちが見ている場合 出力は、ここでは見ることができます

  • that we might have another bug altogether, which is

    我々は別のものを持っている可能性があること で完全にバグ、

  • that we are starting our count from 0.

    我々は0から我々のカウントを開始していること。

  • Now again, this is something that we have seen in the past

    今再び、これは何かであります 我々は、過去に見てきたこと

  • and we can fix quite readily.

    我々は非常に容易に修正することができます。

  • But in this case we also had the benefit of using the printf statement directly

    しかし、この場合、我々はまた、利益を有していました 直接printf文を使用します

  • inside of the for loop to know precisely where that error was occurring.

    以下のためのループの内側に正確に知っています どこでそのエラーが発生しました。

  • >> So printf statements are very useful in helping

    >> だからのprintf文は、 うえで非常に有用

  • you determine where precisely in your source code

    あなたは場所を決定 正確にソースコードに

  • a specific error is occurring.

    具体的なエラーが発生しています。

  • And it's also important to realize that as we're writing code,

    そして、それは実現することも重要です 私たちはコードを書いているように、その、

  • we might have assumptions about the state of a program

    我々は仮定を持っている可能性があります プログラムの状態について

  • or we might have assumptions about what part of the program

    または私達は仮定を持っている可能性があります プログラムのどの部分について

  • is actually correct or incorrect.

    実際に正しいか間違っています。

  • When later on as we build on that program

    ときに、後に、私たちのように そのプログラムの上に構築

  • and make it part of a complex and larger program,

    その一部にします 複雑で大きなプログラム、

  • that we realize that some aspect of that is actually buggy.

    我々はそのいくつかの側面を実現すること そのことを実際にバグがあります。

  • >> Using printf can really help narrow down and identify

    >> printf関数を使用すると、実際に助けることができます 絞り込むと識別

  • the regions of a program that may not be behaving exactly the way that we

    プログラムの地域ということではないかもしれません まさに我々の方法を振る舞うこと

  • expect based on our assumptions.

    私たちの仮定に基づいて期待しています。

  • But there's other tools available as well

    しかし、他のあります 同様に使用可能なツール

  • that allow us to try to figure out where an error is occurring.

    それは、私たちが理解しようとすることができます エラーが発生している場所を。

  • And also, specifically, what things are happening inside of the program.

    そしてまた、具体的には、どのようなもの プログラムの内部で起こっています。

  • So using printf is very useful when we want

    だからprintf関数を使用することは非常にあり 便利なときに私たちが望みます

  • to identify specific areas of a program that have some bug.

    の特定の領域を識別するために いくつかのバグを持っているプログラム。

  • But also becomes tedious after a while.

    しかし、またしばらくすると大変な作業となります。

  • In this case, this is a relatively simple program

    この場合、これは 比較的簡単なプログラム

  • with just one or two variables and it becomes very easy for us

    ただ一つまたは二つの変数を持ちます そして、それは私たちのために非常に容易になります

  • to print out the value of those variables

    値をプリントアウトします これらの変数の

  • in the context of the larger program.

    より大きなプログラムのコンテキストインチ

  • >> But we might have a different program that has many variables

    >> しかし、我々は異なるがあるかもしれません 多くの変数を持つプログラム

  • and it may not be quite so easy to use printf

    そしてそれは非常にではないかもしれません printfのを非常に使いやすいです

  • to try to evaluate what is happening to each one of those variables

    何が起こっているかを評価しようとします これらの変数のそれぞれに

  • as the program is executing.

    プログラムとして実行されています。

  • There's a program that exists called a debugger program.

    存在するプログラムがあります デバッガプログラムと呼ばれます。

  • In this case, the one that we will use is the gnu debugger, or GDB,

    この場合、一つは、我々は、意志 使用は、GDB GNUデバッガですか、

  • that allows us to inspect the internal workings of a program in a much more

    それは、私たちが内部を検査することができます はるか内のプログラムの仕組み

  • detailed way.

    詳細な方法。

  • We can actually execute GDB from the command line

    私たちは、実際に実行することができます コマンドラインからGDB

  • here by simply typing GDB and the command that we want to debug.

    ここで、単にGDBと入力して、 我々はデバッグしたいコマンド。

  • In this case, count.

    この場合、カウント。

  • >> Now this case we can see that it brings us to a prompt that says GDB

    >> 今、この場合、私たちはそのことを見ることができます GDBを言うプロンプトに私たちをもたらします

  • and we can actually execute commands to GDB to actually begin execution

    私たちは、実際にコマンドを実行することができます GDBに実際に実行を開始します

  • of the program, stop it at certain points, evaluate the variables,

    プログラムの、一定で停止 ポイント、変数を評価し、

  • and inspect the variables that exist in the program state

    その変数を検査 プログラム状態で存在します

  • at that particular moment, and so on and so forth.

    その特定の瞬間に、 などなど。

  • It provides a lot of power to us.

    それは、私たちに多くの電力を提供します。

  • >> But it just so happens that the CS50 IDE also

    >> しかし、それはちょうどそう起こります また、CS50 IDEは、

  • provides a GUI, or a user interface, for GDB

    GUIを提供、または GDBのためのユーザインタフェース、

  • that allows us to do this without needing the command line

    それは、私たちがこれを行うことができます コマンドラインを必要とせず

  • interface whatsoever.

    一切のインタフェース。

  • Or at all, even.

    またはまったく、でも。

  • The way that I can access that is by using the Debug button

    私はそれにアクセスすることができる方法 デバッグボタンを使用することです

  • at the very top above the CS50 IDE.

    CS50 IDE上の最上部に。

  • Now, in the past, what we have seen is that we use the command

    今、過去には、我々は何を持っています 見我々はコマンドを使用することです

  • line to compile and then run a program.

    コンパイルして、プログラムを実行するためのライン。

  • The Debug button does both of those steps,

    [デバッグ]ボタンはありません これらのステップの両方、

  • but it also will bring up the Debugger tab on the far right

    それはまた、起動されます 右端の[Debugger]タブ

  • that allows us to inspect a variety properties of the program

    それは、私たちが検査することができます プログラムの様々な特性

  • as it is executing.

    それが実行されます。

  • >> If I click Debug, in this case, it will bring up

    >> 私はこの中で、デバッグをクリックすると、 場合、それが起動します

  • a new tab in the console window at the very bottom.

    コンソールで新しいタブ 一番下にあるウィンドウ。

  • And you can see that this tab has some information at the very top

    そして、あなたは、このタブが持っていることがわかります 一番上にいくつかの情報

  • and we can largely ignore this.

    私たちは、主にこれを無視することができます。

  • But one of the things that we want to notice

    しかし、物事の一つ 私たちは気づくしたいこと

  • is that it outputs the same thing that we

    それを出力することです その私たちは同じこと

  • would get if we tried to run make on the C program in the terminal window.

    私たちがmakeを実行しようとした場合になるだろう ターミナルウィンドウで、Cプログラム。

  • Here we can see it's running Clang and it has a variety of flags

    ここでは、それがクランを実行している見ることができます そして、それはフラグの様々なています

  • and it is compiling our count.c file which was the selected tab at the time

    そして、それは私たちのcount.cファイルをコンパイルしています その時点で選択されたタブでした

  • that I hit Debug.

    私はデバッグを打つこと。

  • >> So this is very useful because now, using this Debug button,

    >> だから、これは非常に便利です 今、このデバッグ]ボタンを使用して、

  • we can see simultaneously compile and then execute the program

    私たちはコンパイルを同時に見ることができます して、プログラムを実行します

  • that we actually want to run.

    私たちは、実際に実行すること。

  • One of the flags that is important in this case we've actually

    重要であるフラグの一つ このケースでは、我々は実際にはしました

  • been using for the longest time but also just did some hand waving at,

    最も長い間使用してきたが また、単に、いくつかの手が手を振っしました

  • which is this one right here.

    これは右ここで、この1です。

  • In clang it says -ggdb3.

    クラングでは-ggdb3氏は述べています。

  • In this case, what we are telling Clang, our compiler,

    この場合、私たちは何をしています クラン言って、私たちのコンパイラ、

  • is that we want to compile our program but also provide

    私たちがコンパイルしたいということです 私たちのプログラムも提供

  • what are called symbol information so that the compiler actually

    どのようなシンボル情報と呼ばれています そのように、実際にコンパイラ

  • has access to a lot of the underlying information contained

    多くのアクセスを持っています 基本となる情報が含まれています

  • within the program.

    プログラム内。

  • Most specifically, the number of functions that I have,

    最も具体的に、数 私が持っている機能の、

  • the names of those functions, the variables, the types

    これらの関数の名前は、 変数、タイプ

  • that those variables are, and a variety of other things that help the debugger

    これらの変数は、と多様であることを デバッガを助ける他のものの

  • perform its operation.

    その操作を実行します。

  • Now, there's something else that's important to mention

    今、何か他のものがあります それは言及することが重要です

  • when we're discussing running a program in this way.

    我々はランニングを議論しているとき このようにプログラム。

  • Notice that it has actually brought up a new tab in our console

    それが実際に持っていることに注意してください 私たちのコンソールで新しいタブを育てました

  • along the bottom.

    下部に沿って。

  • We no longer have to interact directly with the terminal window,

    私たちはもはや対話する必要はありません 直接ターミナルウィンドウで、

  • but this new tab is actually terminal window,

    しかし、この新しいタブがあります 実際にターミナルウィンドウ、

  • it just is specific to the running program that we have created.

    それだけで、実行中に固有のものです 私たちが作成したプログラム。

  • >> Notice that at the bottom, in combination

    >> でそれに注意してください 組み合わせの一番下の、

  • with some output by Clang, the compiler, and GDB, which we can largely ignore,

    クラン、コンパイラによっていくつかの出力と、 私たちは主に無視することができますし、GDB、

  • it actually shows the output of our program at the very bottom.

    実際の出力を示します 一番下に私たちのプログラム。

  • Now, it's important to realize that this one window actually

    今、それが実現することが重要です その実際にこの一つの窓

  • will show you the output from your program

    あなたが表示されます あなたのプログラムからの出力

  • but also can accept input for that program as well.

    しかし、入力を受け入れることができます 同様にそのプログラムの。

  • So notice that it says, please enter a number, which

    だから、言うことがわかり、 番号を入力してくださいします

  • is the same output that we had had in the terminal window before

    私達が持っていた同じ出力があります ターミナルウィンドウの前に持っていました

  • but is now shown in this new tab.

    しかし今、この新しいタブに表示されます。

  • I can input a number and it will actually

    私は、入力数をすることができます そして、それは実際になります

  • function as we expect showing us our debug output, the output that

    機能私たちは私たちを示す期待どおり 私たちのデバッグ出力、出力

  • might be buggy-- as we've seen before-- and at the very bottom

    我々が見てきたようbuggy--されるかもしれません before--と一番下に

  • it actually has some additional output from GDB just saying

    それは実際にいくつかの追加を持ちます GDBからの出力は、単に言って

  • that this program has completed.

    このプログラムが完了したこと。

  • >> Now, as you saw in this particular run through, it wasn't particularly useful.

    >> さて、あなたは、この特定の実行で見たように 通じ、それは特に有用ではありませんでした。

  • Because even though we had the debugger menu come up,

    私達が持っていたにもかかわらず、そのため デバッガのメニューが出てきます、

  • this was still a running program.

    これはまだ実行中のプログラムでした。

  • At no point did actually pause execution for us

    どの時点においても、実際にやりました 私たちのために実行を一時停止

  • to be able to inspect all of the variables contained within.

    の全てを検査することができるようにします 変数は内に含まれます。

  • There's something else that we have to do in order

    何か他のものがあります 私たちは順番に行う必要があること

  • to get GDB to recognize that we want to pause execution of the program

    私たちが望むことを認識することがGDBを取得します プログラムの実行を一時停止します

  • and not just allow it to proceed normally as we would in any other case.

    そしてちょうどそれを進行させません 通常、我々は、他の場合と同じように。

  • >> In order to pause execution at some specific line,

    >> 実行を一時停止するために、 いくつかの特定の行で、

  • we need to create what's called a breakpoint.

    私たちは何を作成する必要があります ブレークポイントと呼ばれます。

  • And a breakpoint is very easily created in the CS50 IDE by taking your mouse

    そして、ブレークポイントは、非常に簡単に作成されます あなたのマウスを取ることによってCS50 IDEで

  • and clicking directly to the left of some specific line number.

    そして左に直接クリック いくつかの特定の行番号の。

  • Once I do that, a red dot appears which indicates that that line is now

    私はそれを行うならば、赤い点が表示されます その行が現在であることを示しています

  • a breakpoint, and the next time that I run GDB,

    ブレークポイント、および 私は、GDBの次回実行時、

  • it will stop execution at that breakpoint

    それは実行を停止します そのブレークポイントで

  • when it reaches that line of code.

    それは、コードのその行に到達したとき。

  • >> Now, this is an important thing to realize.

    >> さて、これは重要です 実現するもの。

  • That it's not necessarily the case that every line of code

    それは必ずしもないことを ケースのコードのすべての行

  • is actually accessible.

    実際にアクセス可能です。

  • If I were to create a function up here, for example,

    私が作成した場合 ここまでの機能、例えば、

  • void f, and just do a print line here, hello world,

    Fを無効にし、ちょうど印刷を行います ここではライン、Hello Worldの、

  • if I never call this function, it will be the case that if I set a breakpoint

    私はこの関数を呼び出すことはありませんならば、それはなります 私はブレークポイントを設定した場合、ケースになります

  • here the function will never be called and therefore

    ここでの機能は決して したがってと呼ばれること

  • this particular breakpoint will never actually pause

    この特定のブレークポイント 実際に一時停止することはありません

  • execution of the program.

    プログラムの実行。

  • >> So let's say that I correctly create a breakpoint on some line of code

    >> それでは、私が正しく作成することとしましょう コー​​ドのいくつかの行にブレークポイント

  • that will actually be executed.

    それが実際に実行されます。

  • Now, in this case, this is the first line in the main function

    今、この場合、これは main関数の最初の行

  • so it will certainly be the case that as soon as I begin execution

    それは確かにケースになります すぐに私が実行を開始すると

  • the very first line will be reached, GDB will pause execution,

    非常に最初の行は次のようになります 到達、GDBは実行を一時停止し、

  • and then I will be able to interact with the debugger.

    そして私のことができるようになります デバッガと対話します。

  • You can set multiple lines as breakpoints if you would like.

    あなたは、複数行を設定することができます ブレークポイントをご希望の場合。

  • We can also create a line up here in this segment of code

    また、ラインアップを作成することができます ここでは、コードのこのセグメントで

  • that will never be reached.

    それに達することはありません。

  • And we can also set one further below.

    そして、我々はまた、以下のいずれかを設定することができます。

  • The reason that we would want to do this we'll

    理由私たちは希望 我々はよこれをしたいです

  • go into a little bit more detail in just a moment.

    より少しに行きます 一瞬のディテール。

  • So for now, let me just disable these additional breakpoints

    だから今のところ、私はちょうど無効にしましょう これらの追加のブレークポイント

  • so that we can look at what happens when I have

    私たちが見ることができるように 私が持っているときに何が起こります

  • one single breakpoint in my program.

    私のプログラムで一つのブレークポイントを設定します。

  • I have made some changes to this program so I need to save it.

    私はこれにいくつかの変更を行いました プログラムは、私はそれを保存する必要があります。

  • I will click Debug so that I can begin the compilation and then

    私は私ができるように、[デバッグ]をクリックします コンパイルを開始し、その後、

  • execution of the debugger.

    デバッガの実行。

  • We will see that after moments the line that we selected as the breakpoint

    我々は瞬間の後にそれを表示されます 我々はブレークポイントとして選択された行

  • is highlighted in yellow.

    黄色で強調表示されます。

  • We can also notice that in the upper right in the Debug panel

    また、中にいることに気づくことができます デバッグパネルの右上

  • that the Pause icon has turned into a little Play icon.

    一時停止のアイコンが変わったこと 少しプレイアイコンに。

  • This means that we have paused execution in this particular case