問題タブ [jpda]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java の Heisenbugs の原因の可能性と可能性は低いですか?
これまでに見たことのない状態によって引き起こされるハイゼンバグの典型的な例があります。私のレガシー アプリケーション (約 100K sloc の古いコード) が特定のインスタンスで正しく動作せず、JPDA をリモート デバッグに有効にするだけで動作が十分に変化し、アプリケーションが正しく動作するようになります: "-Xdebug -Xnoagent -Xrunjdwp: transport=dt_socket,server=y,suspend=n,address=6666" を vm のコマンド ラインに追加すると、バグが隠されます (実際の接続の有無にかかわらず)。完全に再現可能なテスト ケースがあることを考えると、非表示に戻った場合に備えて、コードを変更して混乱させることはあまりありません。もちろん、これは本番環境でのみ発生しています。
通常、私はすぐにスレッドの問題を想定しますが、a) 100% の動作に対して 100% の動作が失敗し、b) 問題のコード パスでスレッドが明示的に使用されていません。その後、私たちのチームはこの動作の他の理由のリストを作成しようとしていたので、スタック オーバーフローのグループ マインドがさらに追加できるのではないかと考えました。
Java の Heisenbugs:
- スレッド: 不適切な同期、競合状態、暗黙の順序の仮定。
- 明示的なデバッグ/ログ コード: コード パスの変更により、問題が発生/防止されます。それほど頻繁ではありませんが、ログ レベルの変更により、タイミングの変更 (再びスレッド化) や I/O リソースの使用の違いが生じる可能性があります。
- ネイティブ コード ライブラリは、Java 以外の Heisenbug の問題を引きずり込む可能性があります。
- ファイナライザーが予測どおりに実行されることを期待しています。
- 弱参照に関する不適切な仮定。
- 固定サイズのキャッシュがいっぱいになることはないと仮定します。
- ハッシュコードの一意性を期待しています。
- == が文字列で機能する (または、場合によってはインターンされる可能性のある文字列では機能しない) という仮定。
- VM のバグです (いや、そんなことは決してありません;)。
- テスト方法のエラー。特に、テストの成功に依存する隠し変数がある場合。(これは私たちの実際の問題のようです。1 つのテストが成功すると、顧客は次のテストを実行するようになりましたが、ポリシーの問題が原因で失敗しました。失敗すると、ポリシーに従ってデバッグ モードで実行され、結果として成功しました。ため息)
調査する価値のある他のケースはありますか?
編集:
- はい、JPDA 有効化コードは古い構文を使用しています。最新の構文を使用しても動作が変わるかどうかはテストしていません。
- この特定のマシンは、JRE に 1.8.0_45-b14、および HotSpot 64 ビット サーバー VM (ビルド 25.45-b02) を使用しています。
- 質問は一般的であることを意図していますが、扇動する問題は現実的で最新のものです。問題は配備されたシステムで顕在化しているため、回避策として -Xdebug を使用して実行したままにしておくことと、根本的なバグを追跡してそれを強制終了したいことの間で悩んでいます。
- 問題の誤動作しているプログラムは、多段階のデータ処理パイプラインの一部です。詳細は重要ではありませんが、データベースから情報を取得し、それを使用してファイルを変更するスタンドアロン アプリケーションとして理解するのが最適です。破損しているシステムの部分は、データベースからの情報が正しく解釈されていないように見えます。破損したオブジェクトの ORM またはキャッシュからのものです。「壊れた」場合、(db の内容に基づいて) 実行する作業があるかどうかを判断するアプリケーション ロジックは、すべての反復 (プログラムの複数の呼び出しを含む数千回の反復) で間違った選択を行います。「機能している」場合 (唯一の違いは、vm が -Xdebug で実行されているかどうかです)、アプリケーションはすべての反復に対して正しい選択を行います。この構成では完全に一貫しています。異なるデータベースに対して同じコードを実行しても失敗しません。過去に同様の動作が見られたといういくつかの証拠があります (このコードに私が関与する前)
debugging - Docker コンテナーでの Tomcat のデバッグ
Vagrant で CoreOS を実行しています。Vagrant プライベート ネットワークの IP は 192.168.111.1 です。CoreOS の内部には、Tomcat 8.0.32 を含む Docker コンテナーがあります。ほとんどすべてが正常に機能します(アプリの展開など)。デバッグだけでは機能しません。Tomcat は 8080 ポートにマップされ、JPDA ポートは 8000 である必要があります。
事実
Tomcat JPDA は以下で構成されます。
コマンドから始まりcatalina.sh jpda start
ます。で実行したときのコンソールの出力docker-compose
は次のとおりです。
コンテナー情報から、ポートは次のようにマップされていると想定しています。
私の docker イメージは、このDockerfileに基づいています。
問題
リモート デバッグ構成 (下のスクリーンショット) を実行しようとすると、エラーが発生しますError running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused"
。さまざまな構成を変更することからすべてを試しましたが、うまくいきません。何か不足していますか?
debugging - JDI invokeMethod() の呼び出し時に TimeoutException が発生しました
カスタマイズしたデバッガーを Eclipse プラグインとして開発しています。この目的のために JPDA API を使用しています。オブジェクト参照変数の値を取得したいと思います。したがって、toString() メソッドを呼び出してObjectReference.invokeMethodを使用しようとします。私のコードは次のとおりです。
ただし、うまくいかないこともあります。たとえば、次のコードがあるとします。
4 行目で問題なく動作します。insert変数の toString() メソッドを呼び出すことで、結果を正常に取得できます。ただし、5 行目で TimeOutException が報告されます。ただ、10秒でJVM起動時のタイムアウトオプションを設定してあるので、toString()メソッド呼び出しの結果を取得するのに十分な時間だと思います。トレース スタックは次のとおりです。問題について何か考えはありますか?ありがとう!
org.eclipse.jdi.TimeoutException: パケット 586 の待機中にタイムアウトが発生しました。 org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:191) の getReply(PacketReceiveManager.java:197) org.eclipse.jdi.internal.MirrorImpl.requestVM(MirrorImpl.java:226) の org.eclipse .jdi.internal.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:428) で microbat.codeanalysis.runtime.variable.VariableValueExtractor.setMessageValue(VariableValueExtractor.java:518)
java - dt_socket の dt は何の略ですか?
Java Platform Debugger Architectureのコンテキストでは、dt_
接頭辞は、たとえば、何を表しているのでしょうかdt_socket
?dt_shmem
デバッガトランスポート? データ転送?
eclipse - Eclipse が jpda デバッガー ポートをオフラインにしているのはなぜですか?
私は tomcat jpda デバッガーを何千回も使用してきましたが、Tomcat が正しくセットアップされていることを知っています。ここで、Eclipse デバッガーをリモートの tomcat jpda にアタッチしようとすると、アタッチされず、ポートがオフラインになります。
netstat -nlp | を使用して、デバッガー ポートが Linux サーバーでリッスンしていることを確認できます。grep 8000. Eclipse からアタッチしようとするとすぐに、ポートがリッスンしなくなります。これを見た人はいますか?
更新: Eclipse を閉じた後にポートが戻ってくるので、部分的に機能しているはずですが、デバッグ パースペクティブに出力が表示されず、ブレーク ポイントにヒットしていないため、何か他のことが起きています。おそらくVPN関連。
java - JDI が複数のクラスにクラス フィルタを適用する
を作成していますが、このリクエストを ex:-とMethodEntryRequest
の 2 つのクラス パターンのメソッドのみに適用したいと考えています。そのために、次のコードを書きました。"java.*"
"sun.*"
上記のコードの問題は、すべてのメソッド イベントを無効にすることです。しかし、クラス パターン メソッドを 1 つだけ適用すると、正常に動作します。でエスケープしようと"|"
しまし"\\\\|"
たが、うまくいきませんでした。複数のクラスパターンにクラスフィルターを適用する方法を知りたいですか?