2017-12-10 14 views
0

Googleを使用して何かを見つけることができないので、私は尋ねています。Javaデバッガインタフェース(JDI) - ブレークポイントを設定する方法

デバッグしたいorg.Exampleです。私はブレークポイントを設定して、ブレークポイントまで実行するためにVMを再開したい。 org.Exampleは単なるダミーの主な機能です。

私はVMを持っていますが、Locationオブジェクトに到達する方法が見つかりませんでした。私は問題をReferenceTypeオブジェクトを取得できないようにしました。

私の問題:私は、私はデバッグするプログラムを実行する必要がVM用の"<Project_DIR>\out\artifacts\javaDebugger_jar\*"にクラスパスを設定し起動コネクタ

との単純なコマンドラインデバッガを持っています。 javaDebugger_jarフォルダには、複数のJARファイル(org/Example.classファイルを含むファイル)があります。

"vm.resume()"を呼び出すと、プログラムが実行されます。私は、メインクラスがロードされていない "再開"前に推測します。

ここではどのような手順ですか?クラスがロードされていることを確認する方法または特定のクラス(私が知っている方法)のメソッドエントリにブレークポイントを設定し、クラス "Example"のブレークポイントをメソッドのエントリと同じように設定する必要があります。

そんなに馬鹿だと思っています。より良い方法がありますか?

答えて

0

だからしばらく考えた後、この動作が予想されます。

すべての(非jdk)クラスがロードされる前にブレークポイントを設定しようとしています。これは単純に不可能です。

私はmainメソッドのmethdエントリを監視し、次にブレークポイントを設定する必要があります。これは、

org.Exampleがロードされていることを意味します。このクラスが依存するすべてのクラスファイルがロードされます。

これは、直接依存するクラスの場合にのみ当てはまります。私はこれがClass.forNameまたはその他のものを介してロードされているJDBCドライバで動作しているかどうかはわかりません。

私にとっては、この解決策で十分です。そのようなクラス(動的にロードされるクラス)がどのように見つかったかを追加したら、この質問にも答えてください。

0

あなたはクラスが用意されているときに通知を受けるために、仮想マシンのイベント要求マネージャーを経て、「要求を準備クラス」を作成することができます、任意のクラスは、VM上で作成されたときに

EventRequestManager erm = machine.eventRequestManager(); 
    erm.createClassPrepareRequest().enable(); 

これはあなたのイベントを提供しますどのようにロードされているかに関係なく。必要に応じて、特定のクラスのみを通知するようにフィルタを設定できます。クラスがロードされたときにブレークポイントを設定するためにこれに依存している場合は、サスペンドポリシーを設定することをお勧めします。

関連する問題