問題タブ [jdi]
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 - インスタンスの囲みインスタンスを取得するにはどうすればよいですか? (com.sun.jdi)
com.sun.jdi
実行中の VM に関する情報の取得、ブレークポイントの追加、スタック フレームの参照などを可能にするパッケージです。
別のインスタンスの囲みインスタンスを取得するにはどうすればよいですか? たとえば、内部クラス Garfield.Lasagna の 4 つのインスタンスを作成し、それぞれ 2 つを Garfield の異なるインスタンスで囲むコードを次に示します。
com.sun.jdi.ObjectReferenceには、インスタンスを囲むインスタンスを取得する方法があると思いますが、そうではないようです。
または、デバッグされた VM でjava.lang.Class.getEnclosing{Class,Constructor,Method}() のようなリフレクションを使用しようとしますが、オブジェクト/インスタンスに適用される関連メソッドが表示されません。
java - Java Debugger Interface (JDI) で静的メソッドを呼び出す
JDIには、メソッドがあります
ターゲット (デバッグ対象) VM でメソッドを呼び出します。
しかし、どうすれば静的メソッドを呼び出すことができますか? そのような場合、私はオブジェクト参照を持っていません。
TIL Java ではnull で静的メソッドを呼び出すことができますが、これはここでは機能しません。
理にかなっているのは
しかし、そのようなものは存在せず、私の人生では、他の方法で行う方法を見つけることもできません.
java - com.sun.jdi パッケージのソース コードはどこにありますか?
jdi を使用して Java コードをデバッグする方法を知りたいのですが、そのソース コードをどこで入手できるかわかりません。それはjdkにありますか?eclipse を使用して src.zip を jdk にインポートしましたが、jdi に関する情報が含まれていないようです。どこで見つけることができますか?
java - プラグインから Eclipse Java デバッガーにアクセスするにはどうすればよいですか?
Eclipse プラットフォーム用のプラグインを開発しています。このプラグインは、現在デバッグ中の Java ソース コードの行に関する情報を提供するために使用されます。
Java プログラムをデバッグするとき、ブレークポイントに到達すると、Eclipse は標準のデバッグ パースペクティブに切り替わります。このパースペクティブ内では、標準のコンソール出力、スタック トレース、およびその他のさまざまなビューとは別に、現在デバッグ中の Java プログラムのソース コードを確認できます。この「ソース コード ビュー」内で、強調表示された行が表示されます。これは、現在デバッグ/評価されているコード行です。この強調表示されたコード行は、私がアクセスしたいものです。
デバッガーがいつ実行されているかを知っていると仮定すると (私は を実装する DebugBreakpointListener クラスを介してそれを評価しますIJavaBreakpointListener
)、デバッガーに「質問する」必要があります。私が必要だと思うのは、デバッガーが現在強調表示/デバッグ/評価しているコード行、またはそのコード行の行番号を直接デバッガーに尋ねることです。
JDIDebugModel への静的アクセスを作成して、Java ブレークポイント リスナーを追加します。
静的参照を使用してデバッガーにアクセスできると思っJDIDebugPlugin
ていましたが、探しているものがまだ見つかりません。
この研究論文のパート 3 で、著者は次のことを提案しました。
Eclipse Java デバッガーは、Java Development Toolkit の一部である Java Debug Interface (JDI) の API に基づいて構築されています。この API を使用すると、リクエストを追加して、BreakpointEvent などの JVM イベントを監視できます。イベントが発生すると、デバッガーは通知を受け取り、このイベントが発生したスレッドを取得できます。このスレッドのスタック トレース内の各フレームについて、次の情報を取得できます。
• このフレームで実行が行われたソース Java ファイル (ソースが利用できない場合は null)。
• メソッドと行番号 (利用可能な場合)。
• メソッドが静的な場合は、このオブジェクトまたは null。
Eclipse デバッガーは、ブレークポイントに到達したときにこの情報を使用します。中断されたスレッドのスタック トレースが [デバッグ] ビューに表示されます。このトレースで選択されたフレームについて、Eclipse はソース ファイル内の対応する行番号を強調表示し、この変数を「変数」ビューに表示します。
この箇条書きにリストされているものは、まさに私が探しているものです。
残念ながら、デバッガーに「プラグイン」する方法に関する詳細なドキュメントは見つかりません。
誰かが私に情報を提供してくれたり、情報やサンプル コードを教えてくれたり、Eclipse JDI プロジェクトの誰かの連絡先を教えてくれたりしたら、非常にありがたいです。
前もって感謝します。
------更新と回答: ------
greg-449 の回答の助けを借りて、やりたいことを正確に実行しました。これが私がしたことです:
私が書いた前述のブレークポイント リスナーbreakpointHit
は、次のようなインターフェイス メソッドを実装しています。
オブジェクトの 1 つに保存されているスレッド オブジェクトとブレークポイント オブジェクトへのポインターを使用してクエリを実行し、フレーム スタック、スレッド、およびヒットした特定のブレークポイントの状態に関する最新情報を取得できました。次のように呼び出して、デバッガーが現在デバッグしているクラスの名前 dn パスを取得できます。
これはまさに私が探していたものでした。ソースコードファイルを手動で読み取り、「改行」文字を区切り文字としてトークナイザーを介して実行し、対応するトークンを取得してその特定の行を読み取る必要があると思います。
java - ObjectReference#invokeMethod を介してメソッドを呼び出した後の InvalidStackFrameException
私は現在、デバッグの可能性を高める Eclipse プラグインに取り組んでいます。com.sun.jdi.ObjectReference#invokeMethod
デバッグ セッション中に、次のようにしてScala メソッドを呼び出します。
それを行った後、 への呼び出しorg.eclipse.debug.core.model.IVariable#getValue
はInvalidStackFrameException
. エラーメッセージ全体は次のとおりです。
Exception while retrieving variable's value
上記のようにメソッドを呼び出した後、変数ビューで変数を調べると、メッセージが表示されます。
この問題をどのように解決できるか考えていますか? JDIは明示的にそれを行う可能性を提供しているので、なぜこれがそれほど問題になるのかわかりません。
更新: Scala IDE のバグである可能性があるため、 Scala IDE dev groupで問題を再現する方法についてのディスカッションとチュートリアルがあります。
java - Eclipse: 認識されないオプション: -g
JDI を使用してデバッグ中にすべてのスレッド情報を表示できるように、JVM オプション「-g」を使用して Eclipse でアプリケーションを起動しようとしています。
ただし、開始時に、Eclipse は次のように表示されます。
私のJVMオプションの完全なリスト:
その他の情報: Mac を使用しています。
JDI で AbsentInformationException を取得せずにデバッグできるように、この問題を解決するための支援をいただければ幸いです。
ありがとうございました、
ディーン
java - JDI - IllegalConnectorArgumentsException: 引数が無効です
JDI を使用して、実行中の別の Java アプリケーションをデバッグしています。
私がすることはうまくいきます:
Eclipse を使用して 2 つのアプリケーションを実行します。デバッガーは、次の VM オプションで起動されます。
/li>もう一方のアプリケーションはポート 4000 のソケットに接続し、通常の手順 (ブレーク ポイントなど) に従ってローカル変数の値を取得します。
適切に機能し、その価値を私に与えてくれます。
今やりたいこと:
Eclipse を使用して 2 つのプロセスを起動する代わりに、Eclipse で 1 つを起動し、次の引数でProcess
a を使用して別のプロセスを起動します。ProcessBuilder
プロセスが正常に開始されます。ただし、最初のプロセスでアクセスしようとすると、次のエラーが発生します。
これをオンラインで調べましたが、例外とは何かについての情報はほとんどありません。
問題が何であるかを理解する助けをいただければ幸いです!