[? DAN ARMADARAS:?]こんにちは、 私は[よ?ダンArmadaras?]。 今日、我々はするつもりです デバッグを見ています。 だけでなく、我々がしようとしています いくつかのテクニックについて話します、 だけでなく、我々が見てするつもりです 特徴のいくつかを含有 許可CS50のIDE内で あなたは簡単にプログラムをデバッグします。 のほんの一例 間違って行くことができるもの それは実際に何か 我々は既に前に見たこと。 この場合、これは、Cプログラムであります すなわち、ユーザからの整数を受け付け 2で除算し、提供 バックユーザに出力。 今、私たちが見てきたものから 以前の講義で、 私たちは、これが実際に原因となりますことを知っています 分割問題の特定のタイプ 私たちは、奇数を持っている場合。 具体的には、私たちは捨てますよ 小数点以下のもの。 今、私たちはこのことを知っています ケースであることを起こります。 そして、我々はそれを実行した場合、我々は確認することができます コンパイルすることにより、私たちの疑惑は、まず、。 そして、実行していることにより、 奇数番号を入力します。 これは新しいものではありません。 しかし、これは実際にあります そのバグの例 より大きなプログラム内に存在することができます それがダウンして追跡することが困難になります。 私たちはどのような問題を知っているにもかかわらず 、問題の真の核心であります 識別しようとしている可能性があります 具体的にどこでエラーが発生し、 何その問題を特定します であり、そしてそれを固定します。 だから例としてこれを提供 何かが何であるかの 我々はすでに知っているが、埋め込むことができること コー​​ドの他の要素の中。 したがって、この他のソースを開きます 例として、コードファイル、 この部門の問題は今あります 大きなプログラムの一部。 まだ少しあるかもしれません 少し不自然な、と私たち 簡単にすることができるかもしれません 特に、それを識別 私たちはこれを議論しているからです。 しかし、我々はこのことを把握することができます 問題は、より大きな規模で存在することができます。 私は今、これをコンパイルした場合 それを実行し、奇数番号を入力し、 我々は正確に取得しないことがわかります 我々が期待している可能性があり、出力。 この特定の場合において、 我々は、我々が言うかもしれません 数字のすべてをカウントします いくつかの特定の数まで1から。 そして、我々は、我々を見ることができます さまざまな問題を持っています ここで我々は、単純に、0を出力している場合 1私たちは5の入力を提供します。 だから我々はすでに知っていること ここでの問題があります。 しかし、我々は正確には知らないかもしれません この問題は、実際に存在する場合。 今その方法の1つを 我々はこの問題を解決しようとすることができます 私たちがきたものです 既にに導入されて。 私達はちょうど大規模にそれを使用することができます。 14行目では、我々は持っています このprintf関数、 私たちは状態をプリントアウトすることを可能にします 各種情報の。 そして、これは何かであることを プログラム内で利用してください です正確に何を把握しようとします コー​​ドの様々なラインで起こっ。 これはない場合であっても 最終的な出力実際に我々 外に演出したいです このプログラム、まだ我々 いくつかのデバッグを持っている可能性があります ステートメントたち 正確に何を把握しようとすることができます 我々のコードの内部で起こっています。 したがって、この場合には、私は意志 デバッグタグが付けられたのprintf。 この場合、これは 単にデバッグ文字列 それはなるように、私はアップ入れていること 私のコードの出力は非常に明確な 何それは私が表示したいということです。 ここと出力数を 我々が計算されていること。 この場合、私はかもしれません 正確に知りたいです 何が前に起こっていると いくつかの特定の演算後。 だから私は前のprintfを使用する場合があります そのコード行の後。 この場合、私もできました それはもう少し明確にします 前にデバッグを言って デバッグ後にそう 私は自分自身を混同しないこと 同じに見える複数の行。 今、私たちは、このファイル名を指定して実行を再コンパイルする場合 それは、再び5のように番号を入力し、 我々は持っていることがわかります 今の前と後の出力 我々は明確に行っていないことがわかります 数の持つ部門またはクリア 私たちは実際にやってみたいこと。 今、この場合、これは 本当にクリア出力。 それは本当に明確な結果ではないこと 我々は、この特定のプログラムの外にしたいです。 そして、これは、再び、あります 少し不自然。 しかし、おそらく、そのことの一つ 仕様が言った場合、私たちは何ができます 私たちはすることによって、これを分割したいこと 2および他の言葉でそう1--を追加し、 我々はその後、up--丸めます 私たちができたことを知っているかもしれません この場合には、その特定のことを行います。 今ここに私たちがなることを知っています 私たちの半分の数に1を追加すること。 それでは、これを再コンパイルしてみましょう このことを確認します 我々が望むように動作しています。 私たちは今、前にそれを見ることができます た、我々は数5を持っています。 た後、我々は、数3を持っています 私たちの仕様に従っています、 私たちがやりたいことです。 しかし、私たちが見ている場合 ここで、出力、私たちすることができます 私たちは別のものを持っている可能性があることがわかり で完全にバグ、 我々は0から我々のカウントを開始していること。 今再び、これは何かであります 我々は、過去に見てきたこと 我々は非常に容易に修正することができます。 しかし、この場合には、我々 また、利益を持っていました printf文を使用します 直接forループの内側 正確にどこに知っています そのエラーが発生しました。 だからのprintf文は、 うえで非常に有用 あなたは場所を決定、 正確にソースコードで、 具体的なエラーが発生しています。 そして、それは実現することも重要です その、私たちはコードを書いているように、 我々は仮定を持っている可能性があります プログラムの状態について。 それとも仮定を持っている可能性があります プログラムのどの部分について 実際に正しいか間違っているとき 後で、我々はそのプログラムに構築します その一部にします 複雑で大きなプログラム 我々はそのいくつかの側面を実現すること そのことを実際にバグがあります。 printf関数を使用すると、実際に助けることができます 絞り込むと識別 プログラムの地域ということではないかもしれません まさに我々の方法を振る舞うこと 私たちの仮定に基づいて、期待しています。 しかし、他のツールがあります 利用できるだけでなく、 それは、私たちが理解しようとすることができます エラーが発生している場所を また、具体的には、どのようなもの プログラムの内部で起こっています。 だからprintf関数を使用することは非常にあり 便利なときに私たちが望みます の特定の領域を識別するために いくつかのバグを持っているプログラム。 しかし、それはまたになります しばらくして退屈。 この場合、これは 比較的簡単なプログラム ただ一つまたは二つの変数を持ちます。 そして、それは私たちのために非常に容易になります これらの変数の値を印刷 より大きなプログラムのコンテキストインチ しかし、我々は異なるがあるかもしれません 多くの変数を持つプログラム。 そして、それはかなりではないかもしれません printfのを非常に使いやすいです 何が起こっているかを評価しようとします これらの変数のそれぞれに プログラムとして実行されています。 存在するプログラムがあります デバッガプログラムと呼ばれます。 この場合、一つは、我々は、意志 使用は、GDB GNUデバッガですか、 それは、私たちが内部を検査することができます はるか内のプログラムの仕組み 詳細な方法。 私たちは、実際に実行することができます コマンドラインからGDB ここで、単にGDBと入力して、 我々はデバッグしたいコマンド。 この場合、カウント。 今、この場合には、我々はそのことを見ることができます GDBを言うプロンプトに私たちをもたらします。 そして、我々は実際にすることができます GDBにコマンドを実行します 実際の実行を開始します プログラムは、特定の時点でそれを停止し、 変数を評価し、 その変数を検査 プログラム状態で存在します その特定の瞬間に、 などなど。 それは、私たちに多くの電力を提供します。 しかし、それはちょうどそう起こります また、CS50 IDEは、 GUIまたはユーザーに提供 GDBのためのインターフェースこと 私たちが必要とすることなく、これを行うことができます いかなるコマンドラインインターフェース またはまったくさえ。 私はそれにアクセスすることができる方法 デバッグボタンを使用することです CS50 IDEの最上部にあります。 今、過去に、我々は何を持っています 見我々はコマンドを使用することです コンパイルして、プログラムを実行するためのライン。 デバッグボタンがありません これらのステップの両方。 しかし、それはまた、起動されます 右端のデバッガタブ それは、私たちは多様性を検査することができます プログラムの特性 それが実行されます。 私はこの中で、デバッグをクリックすると、 場合、それが起動します コンソールで新しいタブ 一番下にあるウィンドウ。 そして、あなたは、このタブが持っていることがわかります 非常に上部にいくつかの情報。 そして、私たちは主にこれを無視することができます。 しかし、物事の一つ 私たちは気づくしたいこと それを出力することです その私たちは同じこと 私たちがmakeを実行しようとした場合になるだろう ターミナルウィンドウで、Cプログラム。 ここで、我々はそれが打ち鳴らすを実行している見ることができ、 そして、それはフラグの様々なを持っています、 そしてそれは、私たちのcount.cファイルをコンパイルしています その時点で選択されたタブでした 私はデバッグを打つこと。 だから、これは非常に便利です 今、このデバッグ]ボタンを使用して、 我々は同時に、次にコンパイルしてできます 実際に私たちのプログラムを実行 実行したいです。 あるフラグの一つ この場合、重要なのは、 私たちは、実際に使用してきました 最も長時間 だけでなく、単にいくつかの手をしました 手を振っ[聞こえない]、これ これはここです。 打ち鳴らすには、-ggdb3を言います。 この場合、私たちは何をしています 打ち鳴らす言って、私たちのコンパイラ、 我々は我々のプログラムをコンパイルしたいということです。 しかし、またあるものを提供 呼ばれるシンボル情報 コンパイラは、実際にアクセスできるように 基礎となる多くの情報へ プログラム内に含まれます。 より具体的には、数 私が持っている機能の、 これらの関数の名前は、 変数、タイプ これらの変数は、と多様であることを デバッガを助ける他のものの その操作を実行します。 今何か他のものがあります それは言及することが重要です 我々はランニングを議論しているとき このようにプログラム。 それが実際に持っていることに注意してください 私たちのコンソールで新しいタブを育てました 下部に沿って。 私たちはもはや対話する必要はありません 直接ターミナルウィンドウで。 しかし、この新しいタブがあります 実際にターミナルウィンドウ。 それはちょうど、実行中に固有のものです 私たちが作成したプログラム。 で、一番下にあることに注意してください いくつかの出力との組合せ コンパイラとGDBを打ち鳴らすことにより、 これは我々が大幅に無視することができ、 実際の出力を示します 一番下に私たちのプログラム。 今では実現することが重要です その実際にこの一つの窓 あなたが表示されます あなたのプログラムからの出力 しかし、入力を受け入れることができます そのプログラムの、同様に。 そう言うの通知 番号を入力してください、 これは私達が持っていた同じ出力であります 前ターミナルウィンドウでいました。 しかし、それは今、この新しいタブに表示さです。 私は、入力数をすることができます。 そして、それは実際になります 我々が期待どおりに機能します 私たちのデバッグ出力を示し、 バギーかもしれない出力、 我々は前に見てきたように。 そして、一番下に、それを 実際にいくつかの追加の出力を持っています GDPからちょうどそれを言って このプログラムは完了しました。 今、あなたはこので見たように 特定の実行、 それは特にありませんでした でもために有用 私たちが持っていたものの、デバッガメニューが来ます アップ、これはまだ実行中のプログラムでした。 どの時点においても、実際にそれをやりました 私たちのために実行を一時停止 の全てを検査することができるようにします 変数は内に含まれます。 何か他のものがあります 私たちは順番に行う必要があること 私たちが望むことを認識することがGDBを取得します プログラムの実行を一時停止します そしてちょうどそれを進行させません 通常、我々は、他の場合と同じように。 実行を一時停止するためには、 いくつかの特定の行で、 私たちは何を作成する必要があります ブレークポイントと呼ばれます。 そして、ブレークポイントは、非常に簡単に作成されています この中にあなたのマウスを取ることによって、IDEをCS50 そして左に直接クリック いくつかの特定の行番号の。 私はそれを行うならば、赤い点 示しており、表示されます そのその行は現在のブレークポイントです。 そして、私は、GDBを実行する次の時間、それを そのブレークポイントで実行を停止します それは、コードのその行に到達したとき。 さて、これは重要です 実現するもの それは必ずしもではないこと ケースのコードのすべての行 実際にアクセス可能です。 私は関数を作成した場合 example--空隙f--ため、ここにアップ ちょうどこんにちはhere--印刷行を行います 私はこの関数を呼び出すことはありません場合は、world-- その場合になります、 私はここにブレークポイントを設定した場合、 関数が呼び出されることはありません。 従って、この 特定のブレークポイント 実際に一時停止することはありません プログラムの実行。 それでは、私が正しく作成することとしましょう コー​​ドのいくつかの行にブレークポイント それが実際に実行されます。 今、この場合、これは main関数の最初の行。 だから、それは確かにケースになります それは、私が実行を開始するや否や、 非常に最初の行に達することになります。 GDBは、実行を一時停止します。 そして、私のことができるようになります デバッガと対話します。 あなたは、複数行を設定することができます ご希望の場合は、ブレークポイントを設定します。 また、ラインアップを作成することができます ここでは、コードのこのセグメントで それに達することはありません。 そして、我々はまた、以下のいずれかを設定することができます。 理由私たちは希望 我々はよこれをしたいです より少しに行きます 一瞬のディテール。 だから今のところ、私はちょうど無効にしましょう これらの追加のブレークポイント 我々は何が起こるかを見ることができますように 私は1つの単一のブレークを持っている場合 私のプログラム内のポイント。 私が作ったいくつかの このプログラムへの変更。 だから私はそれを保存する必要があります。 私ができるように私は、デバッグをクリックします コンパイルを開始し、その後、 デバッガの実行。 我々は、表示され、その瞬間、後 私たちは休憩として選択された行 ポイントは黄色で強調表示されます。 また、中にいることに気づくことができます デバッグパネルの右上 一時停止アイコンが変わったこと 少し再生アイコンに。 これは私たちがポーズを有することを意味します この特定の場合に実行、。 そして、再生ボタンを打つことになります 私たちが実行を再開することができます その特定の時点で。 他のカップルがあることに注意してください このデバッグパネルで使用可能なボタン、 同様に。 に私を可能にする、ステップオーバー コー​​ドの1行を実行 とにその行にステップオーバー この場合の次の1、、、 printfのことを意味します ステートメントが実行されます。 そして、それはその後、一時停止します そうのようなライン13上での実行、。 そして、ステップもあります 関数に、どの 私は他を作成している場合に便利です 他の場所で、ソースコード内の関数。 そして、私はにステップインしたいです これらの関数ではなく、 全体としてその機能を実行します。 しかし、我々はステップでより多くのを見てみましょう 一瞬で関数に。 今ではいくつかの他の事に気づきます 実際にこのデバッグパネル内に存在します。 私たちは、このパネルが呼び出され 私たちを示し、コールスタック、 まさに、私たちはどこにいます。 ここでは、内部にあります 主な機能の。 私たちのスクリプトがcount.cと呼ばれています。 そして、私たちは上のことが起こります 行13、列1、どの されている正確にどのようなハイライト領域 ソースコードのだけでなく、を示しています。 今これがまた表示されていることに気付きます ローカル変数セクションの下 その変数のすべて この関数内に存在します。 それは注意することが重要です 変数のすべてのこと このローカル変数に表示されます 関数内のセクション、 それらが定義されていても前に。 私たちは、変数を持っていることをここで見ることができます NUMと呼ばれ、0のデフォルト値が、 それはint型です。 今、私たちが実際に初期化する前に これらの変数の全て、 私たちは必ずしもじゃありません 0の値を参照することが保証。 そして、他の実行に応じて、 あなたが実行したこと そしてあなたの記憶時の状態 あなたが実際にこのプログラムを実行し、 あなたがいることを見つけるかもしれません 0の値が表示されません そして、その代わりに、他のいくつかのクレイジーな数字。 しかし、心配しないでください。 それはまで関連することはないだろう あなたが実際に値を初期化します。 今、この場合には、我々はそれを見ることができます 私はいくつかの出力を行いました。 そして、私は、今、実行を一時停止しています。 しかし、この場合には、どのような 私は本当にやりたいです 今、この行をステップオーバーすることです コー​​ドのように、私は実際にできること そのint型のためにユーザに問い合わせること 我々は我々のプログラムで使用します。 今、この場合には、時 私は、通知をステップオーバーヒット それはむしろ一時停止または再開 ボタンを押すと、この一時停止ボタンに変更されました このコードが実際に実行されているので。 何が起こっている 今それがあるということです 入力に私たちのためにいくつかの情報を待っています 私たちは、出力テキストで見ることができるように 一番下にあります。 だから、今、これは 実際に一時停止していません、 それは、一種の、表示されるにもかかわらず、 何が起こっていないためであると。 しかし、それはちょうどので、その中でも起こり ライン13上の私の特定の場合、 私は、ユーザーの入力を待っています。 だからGDBは検査することができません それのようなプログラムが実行されています。 私はいくつかを入力してください今すぐ次回 、私はその番号5を入力しますので、input-- 我々は見てきたように ヒットリターンをpast--、我々 予告、その直後に、GDBの一時停止 そして、再び、次の行を強調表示します。 しかしとして、今ことに気づきます 私たちが値を入力した結果、 我々は内部のその値を更新しました これは私たちのローカル変数の 正確に知っていることは非常に便利です その数は、メモリに何でした。 今私は、このプログラムを継続できるようにすることができます その実行が終了するまで演奏 再開]を押すことで。 我々は非常に迅速にそれを見ることができます プログラムの仕上げは実行ん 私たちと同じ出力を持ちます 以前と、デバッガが閉じ、 そして今、このプログラム 完全に停止しました。 私だけのためにあることを示します 何を見ての目的 私たちが実際に再開を打ったときに発生します。 しかし、我々は実際に行っています このプログラムに戻りたいです 我々は、デバッグしようとすることができるように 正確に何が起こっているのか。 私は、デバッガを使用していることを今、私はかもしれません これらのデバッグのprintf文を必要としません。 いただきますよう、私はそれらを削除することができ 今ちょうど私たちの単純なコードに戻ります 私たちは一瞬前に持っていました。 今、私は保存するとき プログラムし、それを実行し、 それは、再び、その初期に移動します 私は11行目に与えた点を破ります。 そして、私は検査することができるでしょう 私の変数は私がやりたいよう。 それはちょうどので、このことが起こります 部分は、非常に興味深いものではありません そして私は、私はつもりだことを知っています この文を印刷します。 番号を入力してください。 そして、私はつもりだことを知っています その整数をユーザーに依頼します。 だから多分、私は実際に私を移動したいです 少しさらに下のポイントを破ります。 あなたは、ブレークポイントを削除することができます 直接、もう一度、クリックして その行番号の左に。 赤い点が表示されなくなります。すなわち、示します そのブレークポイントがなくなっていること。 今、この場合には、 実行が一時停止されています。 そしてそれは実際に起こっていません その特定のインスタンスで再開。 しかし、私は休憩を設定することができます 少し後にポイントします。 そして、私は今、私を再開したとき コー​​ド、それが再開し、教えてくれます そのブレークポイントのポイント。 繰り返しますが、私は再開を打ちます。 何が起こっているように見えるしていません。 しかし、それは私のためです コー​​ドが入力を待っています。 私は、数5を入力しEnterキーを押すと、なります これで次のブレークポイントがヒットします。 今、この場合には、この コー​​ドの行は、 それは、前に、私たちは知っていました バギーであることが起こりました。 それでは、何が起こるかを評価しましょう 時間内に、この特定の時点で。 ラインが​​強調表示された場合、この 行がまだ実行されていません。 したがって、この場合には、我々が見ることができます 私は数を持っていることをします 私はと呼ばれる整数を持っています 値5を有しNUM。 そして、私は実行するつもりです その番号にいくつかの数学。 私はそれをステップオーバーした場合、我々はできます numのその値に気付きます に応じて変更されています 私たちが実際にやった算術。 そして今、我々はしていること このforループの内側 または今そのループのための 自身が強調表示され、 我々は新しいを持っていることを確認 変数iと呼ばれること ループのためにその中で使用されようとしています。 今では私が前に覚えています 時には、あなたがしていることに言及 狂気のいくつかの種類を見に行きます その番号の前にデフォルトとして数 またはその変数があります 実際に初期化されました。 私たちは、正確にそれを見ることができます ここでは、この変数に なかった、Iと呼ばれます まだ初期化されて ハイライトの時。 しかし、我々は、それはいくつかの番号を持っていることがわかります 私たちは実際には期待していないこと。 それで大丈夫です。 ご心配なく 私たちは実際には持っていないので、 私までその数を初期化 このラインと値をステップオーバー 私は、値を1に初期化されています。 だから、実際にだことを確認します 場合は、のステップオーバーしましょう​​。 我々は今それを見ることができます 行が実行されています。 そして、我々は今、ハイライト表示さ​​れています このprintfのライン。 そして、我々は今、どのように私たちの価値観を見ることができます iと3は、時間の経過とともに変化しています。 これは、実際には、行うことは非常に便利です、 繰り返し行をステップオーバーすることです。 そして、あなたは実際に何を見つけることができます あなたのforループの内部で起こります そして、何が起こるに そのループの内部変数 そのプログラムの実行など 一度に一つの段階で起こります。 今、この時点で、私 ちょうど十分なステップオーバー 私は今、私のプログラムの終了時だということ。 私はそれをステップオーバーした場合、それはなります 実際に実行を停止 我々は、過去に見てきたように。 そう、私は再び、これを再起動してみましょう 私が何かを指摘することができ、 同様に。 この場合には、それは 今再び、私を求めて、 数の、どの 私は、もう一度、入力します。 しかし、この時間は、私がに入力するつもりです forループのように、より多く 複数回繰り返されます。 この場合、私は行きますよ 11の値を入力します。 ここでもう一度、私は設定したいので、 15行目にブレークポイント、 それは、その行をハイライトになるだろう。 我々は、我々のことを見ることができます 数11は正しくあり 私たちのローカル変数で表します。 我々は今、その上でできるステッピング 私の私たちの価値に何が起こるか見て 我々はループのために、この内部に進むにつれて。 これはすべての時間、私たちをインクリメントします そのループのトップに到達。 ものの一つ今それかもしれません 実行中に行うことが有用です このプログラムの実際に私のためにあります 確認するために、変数の途中を変更 何が私のプログラムに発生します。 この場合、私は実際にすることができます double値をクリックします。 それがテキストフ​​ィールドになっていることに注意してください。 今私は別の入力することができます 完全値 私のプログラムがどのように動作するか確認してください 私はその変数を変更したとき。 今、この場合には、変数 私は今値10が含まれています。 しかし、プログラムがまだあります 実行中に一時停止しました。 私はステップオーバーすると、私はそれを参照してください。 私は10として入力された値I、 NUMの値より大きくない場合、 これはすぐにループの原因 実行を停止します。 今では唯一ではありません 理由は、あなたが希望 場所に変数を変更したいです。 あなたが実際にお勧めします ので、それを修正しようとします あなたが続けることができること ループの実行 またはそのように変更することができます その前にいくつかの値 演算のいくつかの特定のセットに到達します あなたが実行しようとしていること。 だから今、私たちが実際に変更することを プログラムとして、iの値は、実行していました それが終了するためのループを引き起こし 途中で私は、突然、理由 値よりも大きくなるように起こりました NUMの、そのそのループのための意味 もはや実行する必要はありません。 さらに、それがあることを起こっ 我々は、iの値を変更した場合 17行が強調表示されたときに、 時点でした ループ実行のためにその 実際には評価されていました。 私は、の値を変更した場合 私は別の行に、19を言います 我々は異なる見ているだろう 動作ライン19になるため ループの前に実行しました 条件が再評価されました。 今、この時点で、私は、再び、 このプログラムの終わりに。 そして、私はこれがに進むできるようにすることができます 私のプログラムが自然に終了することができます。 しかし、物事のカップルがあります 奪うために重要であること この特定の議論から。 あなたが評価する必要があります 独自の前提条件 方法についてのコードは動作しなければなりません。 あなたには、いくつかの作品だと思いますいつでも あなたが知っているコードが動作するように起こるの、 それは行くために赤い旗であるかもしれません 背中と評価し、確認してください あなたの仮定のこと どのようにコードが動作しています それがどのように実際には真であります ソースコードで表されます。 しかし、さらにポイントにしました、 私たちは、デバッガを使用しているときに、 あなたはにブレークポイントを置くことができます コー​​ドの異なるライン、 これにデバッガを引き起こします これらの行のそれぞれで実行を一時停止 あなたが評価できるように でもメモリや場所に変更します。 そして再び、あなたができることを覚えておいてください あなたように、複数のブレークポイントを作成します また、実行を再開することができ、スキップ コー​​ドの大部分の上、 そして、それは自動的に一時停止します 次のブレークポイントで。 実際にはより高度なあります デバッガの機能だけでなく。 しかし、私たちはあなたを参照する必要があります いくつかの後続の動画へ 実際にどのように離れていじめるために これらの特定の機能を使用しています。 今のところ、ありがとうございました 見ための非常に。 幸運のデバッグ。