10

Eclipse デバッガーの Java プログラムでウォッチポイントを使用して値の変更を追跡しようとしています。クラス階層はかなり複雑で、私が追跡している値はコンテナーにラップされており、多くの場所で使用されています。

より具体的には、私が追跡しSizeRequirementているプロパティを持つコンテナがあります。minimumこのクラスは、コンポーネントのサイズの要件を定義するために、多くのコンポーネントの多くの場所で多くのレイアウト マネージャーによって使用されます。特定のレイアウトマネージャーとその中の特定のコンポーネントに対して値が変更/設定される正確な呼び出しをキャッチする必要があります。呼び出し元でブレークポイントをフィルタリングすることは可能ですか? いくつかの抽象的なコードを使用して問題を説明しようとします。

class ValueContainer {
  public String value;
}

class A {

  private ValueContainer valueContainer;

  public A () {
    valueContainer = new ValueContainer();
    valueContainer.value = "setByA";
  }

}

class B {

  private ValueContainer valueContainer;

  public B () {
    valueContainer = new ValueContainer();
    valueContainer.value = "setByB";
  }

}

ウォッチポイントをオンに設定し、クラス A によって設定され、B による呼び出しを無視するvalue場合にのみ、ブレークポイントを一時停止するようにします。value

さらに悪いことに、クラスSizeRequirementはスイング ライブラリの一部であり、コードに深く統合されているため、継承を使用して、追跡したい正確な場所にある子に置き換えることはできません。

編集

これは、条件付きブレークポイント条件として使用したものです。信じられないかもしれませんが、うまくいきます。:)

    StackTraceElement[] arr = Thread.currentThread().getStackTrace();
    boolean contains = false;
    for(StackTraceElement e : arr) {
        if (e.getClassName().contains("A")) {
            contains = true;
            break;
        }
    }
4

2 に答える 2

6

それはかなり嫌で、おそらく遅いですが、使用できます

Thread.currentThread().getStackTrace()[2].getClassName().contains("A")

ブレークポイント条件として。

このバグに基づいてhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=72961 Eclipseが直接サポートするとは思わない

于 2013-01-17T15:02:19.553 に答える
0

エクリプスはそれを行うことができます。ブレークポイントを作成し、[デバッグ] パースペクティブと [ブレークポイント] ビューに移動します。ブレークポイントを選択し、

そこで、「条件付き」を有効にして、「値が変更されたときに一時停止」を選択すると言うことができます

次に、下のフィールドに値を入力する必要があります。この場合、おそらく「最小」です。

編集:

私はそれを試してみましたが、期待どおりに機能しませんでしたが、機能する可能性のある別の解決策を見つけました:

Java/Eclipse のデータ ブレークポイント

要約すると、フィールドが定義されている行にブレークポイントを作成すると、ウォッチポイントになります。"Breakpoint Properties" では、アクセス時ではなく (マージンのシンボルはペンになります) 変更時にのみ中断するように指定できます (シンボルは眼鏡になります)。

于 2013-01-17T14:53:28.250 に答える