16

Java でのブレークポイントの設定はどのように機能しますか? ソースファイル名と行番号に基づいているだけですか?クラスまたはメソッド名も考慮されますか?

デバッガーに古いバージョンのソースがあり、ブレークポイントを設定すると、ステップ実行時にカーソルがオフになります。どのくらい離れている可能性がありますか?間違ったメソッド (または、そのファイルに複数のクラスがある場合は間違ったクラス) に入る可能性はありますか?

JVM に同じ名前のクラスが複数ある場合 (複数のクラスローダがある場合に発生する可能性があります) はどうなりますか? それらはすべてブレークポイントを取得しますか?

Web アプリケーション コンテナで、1 つの Web アプリケーションだけにブレークポイントを設定できますか (他のアプリケーションには設定できません)?

これのうちどれが IDE 固有のもので、JVM が提供するデバッグ インターフェイスによってどの程度決定されるのでしょうか? 例: Eclipse では、変数の値に基づいて条件付きブレークポイントを設定できます。それは、JVM の無条件ブレークポイントで Eclipse によって行われるフィルタリングだけですか?

4

2 に答える 2

14

ブレークポイントにはさまざまな種類があります。一部のブレークポイントは行ベースですが、そうでないものもあります。これが実際のデバッグにどのように影響するかは、IDEが実際に何をするかによって異なります。たとえば、Eclipseでは、メソッドの途中にブレークポイントを追加すると、それは行ベースのブレークポイントになります。メソッドのシグニチャを含む行にブレークポイントを追加すると、それがメソッドエントリブレークポイントになります。

表示しているソースコードが実行中のクラスの正確なソースではない場合、もちろん、行ブレークポイントは正しい行にマップされません。そのため、Javaが意図した行で停止しない可能性があり、IDEが実際に間違ったメソッドまたは間違ったクラスを表示している可能性があります。ただし、メソッドが定義された行が変更された場合でも、メソッドエントリブレークポイントは機能します(適切なタイミングで停止します)。ただし、IDEがデバッガーに間違った行を表示する場合があります。(クラスのロードなど、他の種類のイベント/ブレークポイントもあります。..内部について詳しく知りたい場合は、 EventRequestのサブインターフェイスを確認できます)。

他の質問に答えるには:ブレークポイントはJVM内のすべてのクラスローダーに適用されます。

于 2009-05-13T07:04:54.663 に答える
7

JVM はデバッグ用の標準 API をサポートし ( Java Platform Debugger Architectureを参照)、すべての IDE は JPDA を使用して、ブレークポイントの設定、式の計算などの面倒な作業をすべて行います。IDE はそれを "ただ" 素敵なユーザー インターフェイスにまとめます。

ブレークポイントを設定すると、IDE は JVM のツール インターフェイス (JDPA の一部) と通信し、ブレークポイントのソース ファイルと行番号を提供します。JVM には、ブレークポイントの物理的な場所をクラスのコンパイル済みコード内の Java ステートメントの実際の場所にマップするために必要な情報があります。JVM がブレークポイントに到達すると、そのスレッドの実行を停止し、ブレークポイントのソース ファイルと行番号を IDE に通知します。次に、IDE にその場所が表示されます。

デバッグするとき、問題を修正するために行を追加または削除してから、次の問題に進むことがあります。しかし、ブレークポイントが予想よりも早くまたは遅く表示されるようになり、新しいブレークポイントを設定すると、実際には設定したソース行にないため、事態は奇妙になります。これが発生した場合、プログラムを再起動すると、IDE と JVM の両方が再び一貫した状態になります。

于 2009-05-14T05:23:59.697 に答える