2013-01-17 21 views
9

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

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

Bで呼び出しを無視したい

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"; 
    } 

} 

:私はいくつかの抽象コードを使用して問題を説明しようとします

さらに悪いことに、クラスSizeRequirementはスイングライブラリの一部であり、コードに深く組み込まれているため、私はそれを追跡したいと思っている場所で子供の代わりに継承を使うことはできません。

EDIT

だから、これは私が条件付きブレークポイントの条件として使用するものです。信じられない、それは動作します。 :)

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

答えて

5

それはかなり嫌な、おそらく遅いですが、あなたはあなたのブレークポイントの条件として

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

を使用することができます。

このバグhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=72961に基づいて、私はEclipseがあなたの最初のポストに直接

+0

VMをサスペンドせず、そのコードが実行されるたびにスタックトレースを出力します。 – Sentry

+0

@Sentry明確な答え – artbristol

+0

今それは意味があります:) – Sentry

0

Eclipseが可能です。ブレークポイントを作成し、デバッグパースペクティブと「ブレークポイント」ビューに移動します。

あなたは、あなたのおそらくケース「最小」で、以下のフィールドに値を入力する必要があり

あなたが「条件」を有効言うと選択することができ、ブレークポイントとを選択して、「値の変化が時にサスペンド」。

編集:

私はちょうどそれを試してみましたし、期待どおりに動作しませんでしたが、私はうまくいくかもしれない別の解決策発見しました:要するに

data breakpoints in java/eclipse

: 作成しますフィールドが定義されている行のブレークポイントは、ウォッチポイントになります。 「ブレークポイントのプロパティ」では、アクセス時(シンボルはメガネのペアになります)ではなく、変更時にのみ中止するように指定できます(マージンのシンボルはペンになります)。

+0

それをサポートするとは思わない、これは少し誤解です。値は "minimum"に設定されていませんが、それ自体は 'public int minimum = 0'のように 'minimum'という名前です。値が正確なクラスの他のオブジェクトによって設定されている場合、私は一時停止する必要があります。あなたの編集には、はい、私はあなたが示唆したように、ウォッチポイントを使用しようとしています。問題は、値が非常に多くのオブジェクトによって頻繁に変更され、私がしたくないときでさえプログラムが中断されていることです。とにかくお時間をありがとう! – Radium

+0

私は 'minimum'がフィールドの名前であることを理解していますが、それはどういうわけか、特定のクラスからの変更をキャッチしたいだけであるという私の注意を失ってしまいました。私は、 "変更"と "アクセス"についてのみ考えていました。そう、はい、私はartbristolが正しい答えを与えたと思います。 – Sentry

関連する問題