今週は目を見張るほど集中的な一週間でした。コースを提供する新しいYouTube チャンネルは登録者数で爆発的に増加しています。 3週目に入ったばかり…
コースのウェブサイトが公開されました。コース全体を見ることができますが、私は常にビデオを追加しており、作業の約 3 分の 1 を行っています。
現在、3時間17分のコンテンツがあります。もう 1 時間のコンテンツを追加する準備ができており、さらにいくつかのコンテンツに取り組んでいます。コースが完了すると、6時間以上になると確信しています。
また、シリアライゼーション エクスプロイトから身を守ることに関するビデオなど、他の興味深いビデオにも取り組んでいます。今後数週間で、それをカバーする完全なブログ記事を書きます。
ご質問、ご意見、アイデアがございましたら、ぜひお聞かせください。以下は今週のビデオとトランスクリプトです。
Scale でのデバッグの第 3 部へようこそ。ここでは、プロのようにバグを探す方法を学びます。
このセクションでは、デバッグの基礎となるウォッチ式について説明します。これは非常に重要なことなので、後でもう一度取り上げます。
ウォッチエリアは画面下部のエリアです
IntelliJ では、コードの横にウォッチ式を埋め込むこともできます。監視は、デバッガーの最も重要な機能の 1 つです。これは、デバッガーで何が起こっているかを確認する方法です。
しかし、私はそれよりもはるかに深く行きます。特に、これまでで最もクールなデバッガー機能の 1 つであるオブジェクト マーキングについて。
メソッドから戻って、「そのメソッドは何を返したのか」と考えたことはありませんか?
これは、特に戻り値が変数に格納されていない場合によく見られます。幸いなことに、IDE にはその値を保存するオプションがあるため、すぐに調べることができます。
このオプションを有効にすると、将来のすべてのメソッドからの戻り値を確認できます。 isPrime
メソッドにステップ インしてからステップ アウトすると、このメソッドの戻り値が下部に表示されます。
式の評価は、デバッガーの優れた機能の 1 つですが、あまり使用されていません。
右クリック メニューから式の評価ダイアログを起動し、有効な Java 式を入力できます。これは、任意のメソッドを呼び出し、演算を実行し、結果として変数の値を変更することさえできる強力なツールです。
現在のコードでテストするのが難しいものをシミュレートする必要がある場合、ここでプラットフォームを操作して「突飛な理論」を試すことができます。
これは、新しいバージョンの Java にある REPL と非常によく似ていますが、アプリケーションのコンテキストでコードを実行できるため、多くの点で優れています。
間違った値を返すメソッドがある場合、その呼び出しを評価ダイアログにコピーし、呼び出しのさまざまな組み合わせを試して「何が機能するか」を確認することがよくあります。
再起動せずにすべてのオプションを試すだけで、多くの時間を節約できます!
このダイアログは、 Alt-F8
キーの組み合わせで起動できます。
IntelliJ の監視機能は本当に素晴らしいものです。
IntelliJ では、コンテキスト メニューから [インライン ウォッチの追加] を選択することで、ウォッチを IDE エディタに直接埋め込むことができます。これは、私が知る限り、JetBrains に固有の驚くべき機能です。
選択すると、インライン ウォッチを追加した行の右側にウォッチが表示され、コードで簡単に評価できるようになります。これは、何度も同じ行に戻るときに非常に便利です。
他の変数で要素を追加する標準の時計を使用することもできます。これは、コードの大部分を追跡したいオブジェクトに役立ちます。先に進むにつれて、監視エリアについて多くのことを言いたいのですが、今のところ、これは保留にしましょう。
値の設定は、デバッグ時に使用するのを忘れがちな機能です。
強すぎるので残念です。フィールドを右クリックして [値の設定] を選択すると、フィールドの値を設定できます。
F2
を使用してこれを高速化することもできます
値を任意の値に変更できます。これは、既存の値を割り当てたり、作成メソッド、新しいステートメント、または任意の式を呼び出したりできるオブジェクトにも適用できます。
オブジェクトを動的に変更して、テストしたい状態を再現できる非常に強力な機能です。
この機能を、以前に説明した行へのジャンプと組み合わせて、さまざまな順列でメソッドをテストできます。正常に再現できないものも。良い例は、Windows でのみ実行されるコードです。しかし、私はMacを持っています。
現在のオペレーティング システムを示す静的変数の値を変更し、そのコードをテストするだけです。
オブジェクトのマーキングは、このコースで説明する最も優れた機能の 1 つであり、ほとんど知られていません。
少し微妙です。まず、現在のスレッドを表すオブジェクト インスタンスを返すThread.currentThread()
のウォッチを追加します。
ご覧のとおり、ウォッチで現在のスレッドを確認できます。
これで、このメソッドを何度も実行して現在のスレッドを確認できます。メソッドは常に同じスレッドから実行されますか?
そうですね、スレッド ID を見ることができます。それは同じだ。したがって、おそらくスレッドセーフです。しかし、どうすればこれを確認できますか?
通常、オブジェクト ID または変数のポインターを紙に書き留めて、同じ値かどうかを確認します。それは苦痛であり、スケーリングしません。どのくらいの頻度で [続行] を何度も押すことができますか?
右クリック メニューで [オブジェクトをマーク] を選択し、任意の名前を入力します。この場合はMyThread
です。これを行ったら、[OK] をクリックします。
これにより、現在のスレッドの値が新しいラベルに置き換えられます。そのため、これは単なるウォッチ式の名前であると誤って想定する可能性があります。そうではありません。新しい変数を宣言し、 MyThread
という名前を付けました。
ウォッチ式の現在の値をその変数にコピーしました。 IDE でほとんどの変数を扱うのと同じように、その変数を扱うことができるようになりました。
ここで値を評価して、必要なものをすべて取得できます。名前の競合を避けるために IntelliJ によって追加された_DebugLabel
サフィックスに注意してください。ただし、それ以外に、名前の取得やプライベート フィールド名へのアクセスなど、このオブジェクトに対して任意の操作を呼び出すことができます。
しかし、これははるかに良くなります...
このメソッドにブレークポイントを追加しましょう。これは、前に行ったような完全に標準的なブレークポイントです。
これは、標準の条件付きブレークポイントになります。これらについてはすぐに詳しく説明しますが、今知っておく必要があるのは、ブレークポイントが停止するかどうかを決定する条件を定義できることだけです。
拡大してみましょう。
条件を入力してみましょう。 MyThread
をスレッドの現在の値と比較できます。 MyThread の値はMyThread
Thread.currentThread()
の元の監視ステートメントから独立しているため、この条件はそれに応じて動作することに注意してください。
そのため、現在のスレッドが実際に異なる場合、ブレークポイントはこの時点で停止します。
これは、多くのオブジェクトを扱う場合に非常に役立ちます。この場合、メソッドが同じスレッドでヒットするかどうかを文字通りチェックできます。紙にポインターを書く代わりに、オブジェクトを比較するために使用できます。
はい。私は文字通り一枚の紙を持って座って、ポインターアドレスをコピーして、もう一度見たときに正しいことを確認しました.これは非常に多くの点で優れています!
同じ ID を持つ 2 つのオブジェクト インスタンスが存在する可能性がある JPA などの API でよく使用します。これを検出するのは非常に困難です。 1 つのオブジェクトをマークするだけで、それが別のインスタンスであることがすぐにわかります。
このケースは明らかにシングルスレッドであるため、ブレークポイントが再びヒットすることはありません。しかし、これは非常に複雑なケースではうまく機能し、非常に便利なツールです!
次は、ブレークポイントと、ブレークポイントでできる驚くべきことについて深く掘り下げます。これは見逃したくないディープダイブビデオです。
ご不明な点がございましたら、コメント欄をご利用ください。ありがとうございました!