字幕表 動画を再生する 字幕スクリプトをプリント 翻訳字幕をプリント 英語字幕をプリント 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, これは、我々が一時停止したことを意味します この特定の場合に実行、 and hitting the Play button will allow us to resume execution そして、再生ボタンをします打ちます 私たちが実行を再開することができます at that specific point. その特定の時点で。 >> Notice that there's a couple of other buttons available in this Debug panel >> 他のカップルがあることに注意してください このデバッグパネルで使用可能なボタン as well. 同様に。 Step Over, which allows me to execute that one line of code に私を可能にする、ステップオーバー コードの1行を実行 and step over to that line to the next one. そしてそれにステップオーバー 次のいずれかの行。 Which in this case would mean that the printf statement is executed それを意味する。この場合、どの printf文が実行され and it will then pause execution on line 13 like so. それは、その後一時停止します そうのようなライン13上での実行。 And there's also a Step Into function which そして、ステップもあります 関数にします is useful if I have created other functions elsewhere in the source code 私は他を作成している場合に便利です ソースコード内の他の場所の関数 and I want to step into those functions rather than 私はにステップにしたいです これらの関数ではなく、 execute that function as a whole. 全体としてその機能を実行します。 But we'll look more at this Step Into function in just a moment. しかし、我々は、このステップでより多くのを見てみましょう 一瞬で関数に。 Now, notice some other things that actually exist within this Debug panel. さて、いくつかの他の事に気づくこと 実際にこのデバッグパネル内に存在します。 We have this panel called the Call Stack which shows us where exactly we are. 私たちは、コール・スタックと呼ばれるこのパネルを持っています これは我々がどこにあるか正確に私たちを示しています。 In this case, we are inside of the main function, our script is called count.c, ここでは、メインの内側にあります 機能は、私たちのスクリプトがcount.cと呼ばれ、 and we happen to be on line 13 column one. 私たちはあることが起こります 行13列1に。 Which is precisely what the highlighted region of the source code どちらが正確に何であります ソースコードのハイライト領域 indicates as well. 同様に示しています。 >> Now notice that this also shows under the Local Variables section >> 今これがまた表示されていることに気付きます ローカル変数セクションの下 all of the variables that exists within this function. その変数のすべて この関数内に存在します。 It's important to note that all of the variables それは注意することが重要です 変数のすべてのこと will appear in this Local Variable section within a function このローカルに表示されます 関数内の変数のセクション even before they are defined. それらが定義されていても前に。 We can see here that we have a variable called num that has a default 我々は持っていることをここで見ることができます デフォルト値を持つ変数と呼ばれるNUM value of 0 and it is of type int. 0の値は、それがint型です。 Now before we actually initialize all of these variables, 今、私たちが実際に初期化する前に これらの変数の全て、 we're not necessarily guaranteed to see a value of 0. 私たちは必ずしもじゃありません 0の値を参照することが保証。 And depending on other executions that you've performed そして、他に依存 あなたが実行した実行 and the state of your memory when you actually run this program, そしてあなたの記憶時の状態 あなたが実際にこのプログラムを実行し、 you might find that you don't see values of 0 あなたがいることを見つけるかもしれません 0の値が表示されません and instead some other crazy numbers. その代わりに他のいくつかのクレイジーな数字。 But don't worry about that. しかし、心配しないでください。 It's not going to be relevant until you actually initialize the value. それはまで関連することはないだろう あなたが実際に値を初期化します。 >> Now, in this case, we can see that I have performed some outputs >> さて、このケースでは、我々が見ることができます 私はいくつかの出力を実行したこと and I'm right now paused execution. 私は今の実行を一時停止しています。 But in this case, what I really want to do しかし、この場合には、どのような 私は本当にやりたいです is to now step over this line of code so that I can actually 今、この行をステップオーバーすることです コードのように、私は実際にできること query the user for that int that we want to use in our program. そのint型のためにユーザに問い合わせること 我々は我々のプログラムで使用します。 Now, in this case, when I hit Step Over, notice 今、この場合には、時 私は、予告、ステップオーバーヒット that the Pause-- rather the Resume button has changed to this Pause button むしろPause--再開こと ボタンを押すと、この一時停止ボタンに変更されました because this code is actually executing. このコードが実際に実行されているので。 What is happening right now is that it is 何が起こっている 今それがあるということです waiting for us to input some information as we can see by our output text 入力に私たちのためにいくつかの情報を待っています 私たちは、出力テキストで見ることができるように at the very bottom. 一番下にあります。 >> So right now this is not actually paused even though it sort of appears >> だから、今、これは実際にはありません それは一種の表示されていても、一時停止 to be because nothing is happening. 何が起こっていないためであると。 But it just so happens that in my specific case, on line 13, しかし、それはちょうどので、その中でも起こり 私の特定の場合、13行目、 I'm waiting for user input and so GDB is not 私は、ユーザーを待っています 入力ので、GDBではありません able to inspect a program as it is running. 検査することができます プログラムは、それが実行されています。 Now, the next time that I enter some input-- さて、次回はその 私はいくつかを入力input-- so I'll enter the number 5 as we've seen in the past, 私は数5を入力します 我々が過去に見てきたように、 hit Return-- we notice that, immediately, GDB pauses 我々はそれに気づくReturn--ヒット、 すぐに、GDBは一時停止します and again highlights the next line. そして再び次の行を強調表示します。 >> But notice that now, as a result of our inputting a value, >> しかしとして、今ことに気づきます 私たちが値を入力した結果、 we have updated that value inside of our local variables, which 我々は内部のその値を更新しました これは私たちのローカル変数の is very useful to know precisely what that number was in memory. 正確に知っていることは非常に便利です その数は、メモリに何でした。 Now, I can allow this program to continue 今、私はこれを許可することができます 継続するためのプログラム playing until the end of its execution by hitting Resume. その終了時まで遊んで 再開を押すことで実行。 We can see that, very quickly, just does program finish executing 私たちは、非常に迅速に、それを見ることができます 単に実行中のプログラムの仕上げを行います with the same output that we had before. 我々は以前と同じ出力を持ちます。 The debugger closes and now this program has stopped completely. デバッガが閉じ、今、この プログラムは完全に停止しました。 >> I show that only for the purposes of seeing what >> 私だけのためにあることを示します 何を見ての目的 happens when we actually hit Resume. 私たちが実際に再開を打ったときに発生します。 But we actually are going to want to go back into this program しかし、我々は実際に行っています このプログラムに戻りたいです so that we can try to debug precisely what is happening. 我々は、デバッグしようとすることができるように 正確に何が起こっているのか。 Now that I'm using the debugger I may not need these debug printf statements. 今私は私がよいデバッガを使用していること これらのデバッグのprintf文を必要としません。 So I could remove them as I will do now. 私は今行いますように、私はそれらを削除することができます。 Just to go back to our simpler code that we had a moment ago. ただ、私たちは単純に戻ります 私たちは一瞬前に持っていたコード。 >> Now, when I save the program and execute it, >> 今、私は保存するとき プログラムし、それを実行し、 it will again go to that initial breakpoint that I had on line 11 それは、再びその初期に移動します 私は11行目に与えたブレークポイント and I will be able to inspect my variables as I want to do. 私は検査することができるようになります 私の変数は私がやりたいよう。 It just so happens that this part isn't very interesting. それはちょうどので、このことが起こります 一部は非常に興味深いものではありません。 And I know with that I'm going to print out this statement-- そして、私はそのつもりだと知っています このstatement--を印刷します please enter a number-- and then I know that I'm number--を入力してください そして私は私がことを知っています going to ask the user for that integer, so perhaps I ユーザーに尋ねるつもり その整数なので、多分私 actually want to move my breakpoint a little bit further down. 実際に私のブレークポイントを移動します さらに下に少し。 You can remove breakpoints by clicking, again, directly あなたは、ブレークポイントを削除することができます 直接、もう一度、クリックして to the left of that line number. その行番号の左に。 That red dot will disappear indicating that that breakpoint is now gone. あの赤いドットが示す表示されなくなります そのブレークポイントは現在なくなっていること。 >> Now, in this case, execution has been paused >> 今、この場合、 実行が一時停止されました and so it's not actually going to resume in that particular instance. そしてそれは実際に起こっていません その特定のインスタンスで再開。 But I can set a breakpoint a little bit later. しかし、私はブレークポイントを設定することができます 少し後で。 And when I now resume my code, it will resume そして、私は今、再開したとき 私のコード、それが再開されます until the point of that breakpoint. そのブレークポイントの時点まで。 Again, I hit Resume. 繰り返しますが、私は再開を打ちます。 Doesn't seem like anything is happening but that's 何のように見えるしていません ある出来事が、それはです because my code is waiting for input. 私のコードは、入力を待っているので。 I will enter a number 5, hit Enter, and now the next breakpoint will be hit. 私は、数5を入力しEnterキーを押すと、なります 今、次のブレークポイントがヒットします。 >> Now in this case, this is the line of code that before we knew >> 今、この場合、これは 私たちは知っていた前に、そのコードの行 happened to be buggy. バギーであることが起こりました。 So let's evaluate what happens at this particular point in time. それでは、何が起こるかを評価しましょう 時間内に、この特定の時点で。 When a line is highlighted, this line has not yet been executed. ラインが強調表示された場合、この 行がまだ実行されていません。 So in this case, we can see that I have a number which-- したがって、この場合には、我々が見ることができます 私は数を持っていることをwhich-- I have an integer with-- called num that has a value 5 私は整数を持っていますwith-- 値を持っていると呼ばれるNUM 5 and I'm going to be performing some math on that number. 私は実行するつもりです その番号にいくつかの数学。 If I step over that, we can notice that the value for num 私はそれをステップオーバーした場合、我々はできます numのその値に気付きます has changed in accordance with the arithmetic that we've actually done. に応じて変更されています 私たちが実際にやった算術。 And now that we are inside of this for loop, そして今、我々はしていること このforループの内側に、 or now that the for loop itself is highlighted, または今そのループのための 自身が強調表示され、 we see that we have a new variable called i that 我々は新しいを持っていることを確認 変数iと呼ばれること is going to be used in that for loop. ループのためにその中で使用されようとしています。 >> Now, remember before that I mentioned that sometimes you're >> さて、その私が前に覚えています 時には、あなたがしていることに言及 going to see some kind of crazy numbers until-- as default before that number 狂気の数字のいくつかの種類を見に行きます その番号の前にデフォルトとしてuntil-- or that variable is actually initialized. またはその変数があります 実際に初期化されました。 We can see that precisely here in this variable 私たちは、正確にそれを見ることができます ここでは、この変数に called i which has not yet been initialized 私はなかったと呼ばれます まだ初期化されて at the time of highlighting, but we can see 時の ハイライトが、我々は見ることができます that it has some number that we wouldn't actually expect. そのいくつかの番号を持っていること 私たちは実際には期待していません。 That's OK. それで大丈夫です。 Don't worry about it because we have not actually ご心配なく 私たちは実際には持っていないので、 initialized that number until I step over this line and the value 私までその数を初期化 このラインと値をステップオーバー i has been initialized to the value 1. 私は、値を1に初期化されています。 >> So to see that that's actually the case, let's step over. >> だから、実際にだことを確認します 場合は、のステップオーバーしましょう。 We can now see that that line has been executed 我々は今それを見ることができます 行が実行されました and we are now highlighting this printf line. 私たちは今の強調表示されています このprintfのライン。 And we can now see how our values of i and 3 have changed over time. そして、我々は今、どのように私たちの価値観を見ることができます iと3は、時間の経過とともに変化しています。 This is very useful to do, in fact, is to step over lines repeatedly. これは、実際には、行うことは非常に便利です、 繰り返し行をステップオーバーすることです。 And you can find what actually happens inside of your for loop そして、あなたは実際に何を見つけることができます あなたのforループの内部で起こります and what happens to the variables inside of that for loop そして、何が起こるに そのループの内部変数 as that program execution occurs one step at a time. そのプログラムの実行など 一度に一つの段階で起こります。 >> Now, at this point I stepped over just enough >> さて、この時点で私は ちょうど十分なステップオーバー that I now am at the end of my program. 私は今、私のプログラムの終了時だということ。 If I step over that, it will actually cease execution 私はそれをステップオーバーした場合、それはなります 実際に実行を停止 as we have seen in the past. 我々は、過去に見てきたように。 Let me restart this yet again so that I can point something else out as well. ように私はまだこれを再び再起動してみましょう 私も何かを指摘することができます。 In this case, it is now asking me, again, この場合には、それは 今再び、私を求めて、 for a number which I will again enter. 私は再び入る数について。 But this time I'm going to enter in a larger number so that the for loop しかし、この時間は私がで入力するつもりです forループのように、より多く will iterate more times. 複数回繰り返されます。 In this case I'm going to enter a value of 11. この場合、私は行きますよ 11の値を入力します。 >> Now, again, because I'd set a breakpoint at line 15, >> さて、再び、私は設定したいので、 15行にブレークポイント、 it's going to highlight that line. それは、その行をハイライトになるだろう。 We can see that our number 11 is correctly 我々は、我々のことを見ることができます 数11は正しくあり represented in our local variables. 私たちのローカル変数で表します。 Stepping over that we can now watch what happens to our value of i 私たちが今見ることができることをステップオーバー 何が私の私達の価値はどうなります as we proceed inside of this for loop. 我々はループのために、この内部に進むにつれて。 It gets incremented every time we reach the top of that for loop. これはすべての時間、私たちをインクリメントします そのループのトップに到達。 >> Now, one of the things that might be useful to do during execution >> そのかもしれないものの今、1 実行中に行うことが有用です of this program is really to actually change the variables midstream このプログラムの実際に実際にあります 変数の途中を変更 to see what happens to my program. 私のプログラムに何が起こるかを確認します。 In this case I can actually double click the value. この場合、私は実際にすることができます double値をクリックします。 Notice that it becomes a text field. それがテキストフィールドになっていることに注意してください。 Now I can enter a different value altogether 今、私は入力することができます 別の値を完全 to see how my program behaves when I've changed that variable. 私のプログラムがどのように動作するか確認してください 私はその変数を変更したとき。 >> Now in this case, the variable i now contains the value 10 >> 今、この場合には、変数 私は今値が含まれています10 but the program is still paused in execution. しかし、プログラムがまだあります 実行中に一時停止しました。 When I step over, I see that i-- the value i which I entered as 10 私はステップオーバーすると、私はそれを参照してくださいi-- 私は10として入力された値I is now greater than the value of num which immediately causes the for loop 今NUMの値よりも大きいです これはすぐにループの原因 to stop executing. 実行を停止します。 Now that's not the only reason why you would 今では唯一ではありません 理由は、あなたが希望 want to modify the variable in place. 場所に変数を変更したいです。 You might actually want to try to modify it so あなたが実際にお勧めします ので、それを修正しようとします that you can continue execution of a loop あなたが続けることができること ループの実行 or so that you can modify some value before it またはそのように変更することができます その前にいくつかの値 reaches some specific set of arithmetic that you are about to perform. 演算のいくつかの特定のセットに到達します あなたが実行しようとしていること。 So now that we've actually changed the value of i だから今、私たちが実際にしたこと iの値を変更し as the program was executing, it caused the for loop プログラムとして実行していました、 それはループのために引き起こされます to quit prematurely because all a sudden i happened ので、途中で終了します 私は起こった突然 to be greater than the value of num. NUMの値よりも大きくします。 Meaning that that for loop no longer needed to be executed. 意味そのループのそれなし 長く実行する必要がありました。 Further, it happened to be the case that we changed the value of i さらに、それがあることを起こっ 我々は、iの値を変更した場合 when the line 17 was highlighted which was the point in time 17行が強調表示されたとき 時点でした that the for loop execution was actually being evaluated. ループ実行のためにその 実際には評価されていました。 If I had changed the value of i on a different line, say 19, 私は、の値を変更した場合 私は別の行に、19を言います we would have seen different behavior because line 19 would 我々は異なる見ているだろう 動作ライン19になるため have executed before the loop condition was reevaluated. ループの前に実行しました 条件が再評価されました。 >> Now at this point, I'm, again, at the end of this program >> 今、この時点で、私は、再び、 このプログラムの終わりに and I can allow this to proceed to allow my program to quit naturally. そして私はこれがに進むできるようにすることができます 私のプログラムが自然に終了することができます。 But there's a couple of things that are important to take away しかし、物事のカップルがあります 奪うために重要であること from this particular discussion. この特定の議論から。 You need to evaluate your own assumptions あなたが評価する必要があります 独自の前提条件 about how the code should be behaving. 方法についてのコードは動作しなければなりません。 Any time you think that some piece of code you know happens to work, あなたには、いくつかの作品だと思いますいつでも あなたが知っているコードが動作するように起こるの、 that might be a red flag to go back and evaluate and be sure それは行くために赤い旗であるかもしれません 背中と評価してください that your assumption of how that code is operating あなたの仮定のこと どのようにコードが動作しています is actually true to how it is expressed in your source code. それがどのように実際には真であります ソースコードで表されます。 >> But even more to point was when we were using the debugger. >> しかし、さらに点にあった場合は 私たちは、デバッガを使用していました。 You can put breakpoints at different lines of code あなたはブレークポイントを置くことができます コードの異なるラインで which will cause the debugger to pause execution at each of those lines これにデバッガを引き起こします これらの行のそれぞれで実行を一時停止 so that you can evaluate the memory or even change it in place. あなたが評価できるように でもメモリや場所に変更します。 And again, remember that you can create multiple breakpoints so that you そして再び、あなたができることを覚えておいてください あなたように、複数のブレークポイントを作成します can also resume execution, skip over large portions of code, また、実行を再開することができ、スキップ コードの大部分の上、 and it will automatically pause at the next breakpoint. それが自動的になります 次のブレークポイントで一時停止。 >> There's actually more advanced features of the debugger as well. >> 実際にはより高度なあります デバッガの機能なども。 But we'll have to refer you to some subsequent videos しかし、私たちはあなたを参照する必要があります いくつかの後続の動画へ in order to really tease apart how to use those particular functions. 実際にどのように離れていじめるために これらの特定の機能を使用しています。 For now, thank you very much for watching and good luck debugging. ここでは、のためにどうもありがとうございました 見て、幸運のデバッグ。
B1 中級 日本語 実行 プログラム 変数 場合 出力 停止 セクション。Dan Armendariz でのデバッグ (Section: Debugging with Dan Armendariz) 100 5 Amy.Lin に公開 2021 年 01 月 14 日 シェア シェア 保存 報告 動画の中の単語