記事ディレクトリ
序文
リモート デバッグは非常に便利です。私の個人的な実際の経験では、新しく開発した関数が本番環境で有効にならなかったことがありました。ログを確認したところ、データに問題は見つかりませんでした。最後に、リモート デバッグを使用して、新しく開発したコードが有効であることを確認しました。存在しなかった。
なので、必要がなくても構いませんが、応急処置としてやらなければなりません。
出典:この記事は「 IDEAのリモートデバッグデバッグ、ダイレクトオンラインショー運用」をもとに転載、加筆、補足したものです。
構成
IDEAの設定
上位バージョンと下位バージョンのIDEAの設定はインターフェースが若干異なる場合があります。私は2020.1.1を使用しています。ほぼ同じです。自分で調べてください。
-
「構成の編集」を選択します
-
プラス記号をクリックして「リモート」を選択します
-
詳細な構成については図を参照してください
注: ポートが占有されないように注意してください。後続のポートは、リモート Java プロセスとの通信に使用されます。
プロジェクトを開始するコマンドは、異なる JDK バージョンの切り替えに応じて異なるスクリプトを生成することがわかります。
jdk1.4を選択すると、
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=50055
他のブログを検索するとそのような構成があり、実際にこの構成も実現可能です。しかし、より正確には、以下の jdk5-8 の設定に従う必要があります。
jdk 5-8を選択すると、
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055
jdk9以降を選択すると、
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:50055
jdk9が安全になったため、リモートデバッグはローカルでのみ許可されると言われています。リモートしたい場合は、ポートの前に*を設定する必要があります
起動スクリプトの改良
アイデア構成で取得したリモート JVM のコマンド ライン引数、つまり -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 を使用します。
変更した起動スクリプトは次のとおりです
nohup java \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 \
-jar remote-debug-0.0.1-SNAPSHOT.jar &
^ はウィンドウ内の改行に使用されることに注意してください。たとえば、
java ^
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 ^
-jar remote-debug-0.0.1-SNAPSHOT.jar
例証します:
-
ポートは占有されていない場合でも自由に設定できますが、IDEA のリモートに設定されたポートと一致している必要があります。他のパラメータをコピーします。パラメータの詳細な説明については、付録を参照するか、自分で検索してください。
-
Remote-debug-0.0.1-SNAPSHOT.jar は独自の jar パッケージ名に変更されます
-
指定したスクリプトはバックグラウンドで実行されます。バックグラウンドで実行する必要がない場合は、nohup と & を自分で削除してください
-
IDEA で構成したばかりのものを選択して開始します
詳細
詳細 1: ローカル ブレークポイントで停止しますが、プログラムを閉じた後も実行は継続されますか?
リモート デバッグが独自のブレークポイントで停止し、IDEA 内のプロジェクトが閉じられて実行が停止された場合、プロジェクトは引き続き実行され、残りのロジックが実行されますか? はい、覚えるのは簡単ではありません
次のコードを例にとると、最初の行で停止します。その後、IDEA で停止し、停止後もコンソールが残りのログを出力していることがわかりました。
詳細 2: jar パッケージのコードがローカルのコードと一致しない場合はどうなりますか?
IDEA のコードが jar パッケージと一致しない場合はどうなりますか。
結論: コードがリモート起動と一貫していることを確認してください。
そうしないと、デバッグ時に行数が一致しません。エラーを報告したり、例外をスローしたりすることはできません。このように行数を一致させることもできます
たとえば、test1 メソッドをデバッグする場合、test2 メソッドは test1 の下にあり、test2 にコードを追加しても test1 の行番号には影響せず、デバッグ中に行番号を正確に反映できます。(詳細に記載されている製品コードがローカル コードと一致していないこともわかりました)
詳細 3: ログはどこに出力されますか?
ログは IDEA のコンソールには出力されません。つまり、System.out と log.info は引き続きリモートで出力されます。
詳細 4: デバッグ中に他の人がスタックすることはありますか?
リモート デバッグ中にブレークポイントにヒットした場合、ページ リクエストは停止後にスタックしますか?
たとえば、リモート デバッグを使用する場合、他の QA がこのページをテストしている場合、どのような結果が表示されますか? 引っかかってしまうのでしょうか?はい、これは実際に私に起こりました。
詳細 5: ローカル コードでバグが修正されましたが、リモート呼び出しは実行されますか?
リモート デバッグ プロセスでバグを見つけた場合は、ローカル変更後に IDEA でプロジェクトを再起動し、ページ上で再度呼び出します。修正できますか?いいえ、リモートにデプロイされた jar 内のコードはまだ実行されています
詳細6:ローカルドロップフレーム(リセットフレーム)の問題
ドロップフレームの問題ですが、ドロップフレームを再デバッグすると2レコード挿入されるのでしょうか?
まずそれについて話しましょうドロップフレームとはidea のデバッガーでアプリケーションのコール スタックを表示し、ドロップ フレーム機能を使用すると、前のスタック フレームに戻ることができ、ある意味、過去に戻ることができます。 again は、関数を再入力するのに役立ちます。簡単に言うと、直前に呼び出したメソッドに戻ります。
友人の中には、「デバッグ中にドロップ フレームが見つからないのはなぜですか?」と尋ねる人もいるかもしれません。
実はこれはバージョンに関係しており、2022.1 バージョンより前は Drop Frame と呼ばれていましたが、その後 Reset Frame に変更されました。
さて、質問を続けましょう。下の図 userMapper.insert(eo) に示すように、このメソッドは @Transactional で装飾されておらず、トランザクションはマッパー メソッドの実行直後に送信され、追加の行が存在します。ライブラリ テーブル内のレコードの数。フレームをドロップした場合は、デバッグをやり直し、コードを再度実行して、別のレコードを挿入します。
@Transationalを付けるとレコードが2つなくなり、Drop Frame実行時にトランザクションが送信されず、挿入コードが再挿入されなくなります。
詳細 7: リモート ドロップ フレームの問題
上記のデータベースへの挿入ロジックがリモート インターフェイス呼び出しに置き換えられ、ドロップ フレームの後に同じコードが再度実行される場合、リモート インターフェイスは 2 回実行されますか? しましょう。