2013-01-17 73 views
9

我想在Eclipse調試器中使用Java程序中的觀察點來跟蹤值的更改。類層次結構非常複雜,我正在跟蹤的值被包裝在容器中,在許多地方使用它。在Java eclipse中調用者的條件斷點

更具體地說,有一個容器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"; 
    } 

} 

我設置一個觀察點上value,我只希望只有當value由A級設置斷點以暫停和B.

忽略來電

爲了讓事情變得更糟,類SizeRequirement是swing庫的一部分,並深深地集成在代碼中,所以我不能使用繼承來替換某個孩子在我想跟蹤它的確切位置。

編輯

所以這是我作爲條件斷點條件。相信與否,它的工作。 :)

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可以做到這一點。創建一個斷點,然後進入Debug透視圖並進入「Breakpoints」視圖。選擇斷點和

在那裏,你可以說使「條件」,然後選擇「暫停時價值變動」

然後,您必須在下面的字段中輸入你的價值,你的情況可能是「最低」。

編輯:

我只是去嘗試,並預期它沒有工作,但我發現另一種解決方案可能的工作:

data breakpoints in java/eclipse

總結: 創建在定義字段的行中有一個斷點,它將成爲一個觀察點。在「斷點屬性」中,您可以指定它僅在更改時暫停(邊距上的符號將是筆),而不是訪問(符號將是一副眼鏡)。

+0

支持到您的第一篇文章,這是有點誤會。該值未設置爲「minimum」,但其本身被命名爲「minimum」,如「public int minimum = 0」。我需要暫停,當值由其他確切類別的對象設置時。對你的編輯而言,是的,我正在嘗試使用一個觀察點,正如你所建議的那樣。問題是,這個值經常被很多對象改變,即使我不想要,程序也會暫停。無論如何感謝您的時間! – Radium

+0

我的確明白'最低限度'是該領域的名稱,但它不知何故地讓我注意到,你只想捕捉某個班級的變化。我以爲只是關於「改變」vs「訪問」。所以是的,我認爲artbristol給出了正確的答案。 – Sentry