paint-brush
上級開発者のようにデバッグ: プログラム制御フローのデバッグ@shai.almog
956 測定値
956 測定値

上級開発者のようにデバッグ: プログラム制御フローのデバッグ

Shai Almog7m2022/12/14
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

制御フローは、ステップ オーバー以上のものです。デバッグ中に任意のコード オフセットに「ジャンプ」して、精巧な状態と動作を再現できます。
featured image - 上級開発者のようにデバッグ: プログラム制御フローのデバッグ
Shai Almog HackerNoon profile picture

現在、コースの最初の 3 つのビデオを公開しており、明日は 4 つ目のビデオを公開する予定です。影響を最大化するために、YouTube で週に 2 本のビデオを公開する予定ですが、ここでは、過飽和を避けるために、週に 1 つのレッスンのみをブログに掲載します。


約 4 時間のビデオ コンテンツを撮影しましたが、8 つのモジュールのうち 2 番目のモジュールをまだ完了していません。このコースは非常に詳細で集中的なものになります。


私は現在、コースプラットフォームに取り組んでおり、順調に進んでおり、ここですぐに公開したいと考えています。あなたがこれを読んでいる頃には、すでに公開されているかもしれません!


コース プラットフォームのユーザー エクスペリエンスが満足できるものであることは、私にとって重要です。なので、DRMは極力避けました。願わくば、人々がそれと私がこれに注いでいる努力を尊重してくれることを願っています。


私はGraalVMを使用してSpring Boot 3でコースプラットフォームを構築しているので、理想的には無駄がなく、高速で、非常にシンプルになります。 YouTube で動画を非公開動画としてホストし、適切な視聴体験を提供する予定です。


これは、開発者が私の信頼を裏切り、リストにない動画を共有する可能性があることを意味します.そうでないことを願っています。


ここでの私の理由は、オーバーヘッドが低く、パフォーマンスが優れているからです。また、数年以内にコースを無料にしたいと考えています。 YouTube を利用して、動画を公開することでコースを無料にすることができます。


次のビデオでは、デバッグにおける制御フローについて説明します。これは基本から始まりますが、行へのジャンプ、強制復帰など、かなり深くなる可能性があります。これらは、コードのデバッグ方法を大幅に変更できるツールです。


私のをチェックして、今後のビデオのためにYouTube チャンネルに登録することを忘れないでください!

成績証明書

Scale でのデバッグの第 2 部へようこそ。ここでは、デバッグの秘密のトリックを学ぶことができます。


このセクションでは、デバッグの最も基本的な側面について説明します。ブレークポイントに到達しました。それで?

ここで、デバッガーを使用してフローを制御し、制御された環境ですべてがどのように機能するかを調査します。


では、今日の議題は何ですか?


ステップ オーバーとコードへの移行について説明します。このリストのほとんどがよく知られていることを願っています。制御フローを中断する最後の 2 つの項目は、なじみがないかもしれません。議題の最後の項目については、ほとんどの方がご存知ではないかと思います。どうすればわかりますか?お楽しみに!

ステップオーバー、イントゥ、アウト、フォース

ステップ オーバーは、制御フローの最も基本的な形式です。行のコードを実行すると、変数ペインで結果を調べることができます。シンプルで簡単です。


この場合、ここでボタンを数回押しただけですが、F8 を押すだけで同じ効果が得られます…


次に、ステップ インと関連するステップ アウトという 2 つの異なる操作について説明します。ステップ インは、呼び出したメソッドに入ります。ステップに入るメソッドがない場合、into はステップ オーバーのように動作することに注意してください。


2 つのステップイン操作があります。通常のものと、通常は同じように機能する強制ステップ。 IntelliJ が通常スキップする API にステップ インする場合は、強制バージョンが必要です。 F7 を押すと、メソッドにステップインできます。 Shift F7 を押すと、強制的にステップ インできます。


メソッドを見終わって残りのことを気にしなくなったら、ステップアウトできます。これにより、残りのメソッドが実行されて戻ります。


この場合に見られるように、リターンの前にブレークポイントがある場合でも、ブレークポイントで停止することに注意してください。ここでこのボタンを押してステップアウトするか、Shift-F8 を押して同じことを行うことができます。

続行してカーソルまで実行

Continue は、ブレークポイントが再びヒットするまで、プロジェクトの実行を続行します。これは履歴書とも呼ばれます。よく使うシンプルな機能です。ここで再生ボタンの特別バージョンを押すと続行できます。ショートカットもよく使うので便利です。F9 です。


カーソル位置まで実行すると、興味のない行をスキップして重要なコードに到達できます。その行にブレークポイントを設定して同じ効果を得ることができますが、これはブレークポイントを設定および設定解除する必要がないため、より便利な場合があります。


このボタンを押してカーソルまで実行するか、ALT-F9 をこの機能のショートカットとして使用できます。

強制復帰とスロー例外

この機能は、IntelliJ/IDEA では強制復帰として知られています。


強制復帰オプションを表示するには、スタック トレースを右クリックし、一連のオプションを表示します。さらに興味深いオプションは、すぐに紹介するドロップ フレームです。


例外をスローするオプションは強制復帰と同じですが、メソッドから例外をスローします。


このオプションをクリックすると、メソッドからの戻り値を入力するダイアログが表示されます。これにより、メソッドから返される値を変更できます。これは、再現が困難なバグをデバッグする場合に非常に役立ちます。


顧客に障害が発生したが、それを再現できない場合を想像してください。この場合、メソッドから別の値を返すことで、顧客が経験している可能性があることをシミュレートできます。


ここでは、値はブール変数なので単純です。ただし、コードがオブジェクトを返す場合があります。この手法を使用すると、そのオブジェクトを任意の値に置き換えることができます。良い例は null です。このメソッドが null を返した場合、ユーザーが経験している問題を再現できますか?


同様に、例外をスローすると、任意の障害による例外のスローなどのエッジ ケースを再現できます。


OK を押すと、別の値が返されます。この場合、私はメソッドの端にいましたが、メソッドの開始時に実行して、メソッドの実行を完全にスキップすることもできました。


これにより、メソッドが失敗する可能性があるケースをシミュレートできますが、その動作をモックしたいと考えています。顧客が見た動作を再現できない場合、それは理にかなっています。このようなツールを使用してシミュレートできます。

ドロップ フレーム

ドロップ フレームはほぼ革新的ですが、より「巧妙なトリック」でもあります。ここで、私は誤ってメソッドにステップインしました。おっと、私はそれをしたくありませんでした。介入する前に何かを変更したかったのですが… 幸いなことに、ドロップ フレームがあります。


右クリックメニューでアクセスできることがわかりました。ここをクリックしてトリガーすることもできます。


ドロップ フレームは、スタック フレームを効果的にドロップします。取り消し操作です。しかし、それは正確にはそうではありません。ステップしたメソッド内で発生した状態の変更を元に戻すことはできません。


そのため、メソッドにステップ インし、スタック上にない変数が変更された場合、それらは変更されたままになります。


スタック上の変数は、メソッドが引数として宣言または受け入れる変数であり、それらはリセットされます。ただし、これらの変数のいずれかがオブジェクトを指している場合、そのオブジェクトはヒープに常駐し、スタックをアンワインドしてもヒープ内の変更をリセットできません。


これは、次の行ではなく現在の行に戻ることを除いて、強制復帰に似た非常に便利な機能です。したがって、値は返されません。


これはそれよりもさらに良くなります!

行にジャンプ

行へのジャンプは、IntelliJ の秘密の機能です。機能しますが、開発者はそれについて知りません。これを使用するには、Jump to Line プラグインをインストールする必要があります。インストール数が比較的少ないため、人々はその存在を知らないだけだと思います。これは必須のプラグインだからです。デバッグの方法が変わります。


行へのジャンプを使用すると、現在の命令ポインターをメソッド内の別の位置に移動できます。左側の矢印をドラッグして、実行を新しい場所に移動できます。これは両方向に機能することに注意してください。現在の実行を前後に移動できます。


これは途中でコードを実行するのではなく、文字通り現在の命令を新しい位置に移動します。かっこよすぎてまた見せなきゃ…


バグが見つかった場合は、実行をドラッグして再現してください。変数の値を変更して、問題を完全に理解するまで何度でも再現できます。


失敗しているコードなどをスキップできます。これは素晴らしいことです。コードを再コンパイルする必要はありません。誤ってラインをまたいでしまったことがあり、「おっと。それは私が望んでいたことではありません。」

その後、デバッガーを停止し、ゼロから開始しました。これはあなたのためのプラグインです。これはみんなに起こりました!


実行をドラッグしてやり直すことができます。それは絶対に素晴らしいです!

ついに

次のビデオでは、時計について簡単に説明します。シリーズの 6 番目のビデオで、さらに深く掘り下げます。お楽しみに!


ご不明な点がございましたら、コメント欄をご利用ください。ありがとうございました!