2012-11-16 40 views
1

[編輯:讓我重新整理] 說發生在調試對象o具有性能ab,其值nullHello。是否有可能自動生成下一個調試會話以下代碼:的NetBeans調試最佳實踐

if(o.a == null && o.b == "Hello") { 
} 

調試時具有應對複雜的用戶輸入,如編程語言解析器的程序,我經常要開始調試從解析過程中的某個點開始。當處理來自特定行輸入代碼的指令時,我實現了一種簡單的啓動方式。
但是,行可能包含非常複雜的指令,導致代碼中的深度遞歸,因此在開始調試後,我必須手動進入程序。當這種情況發生在一個功能func(obj a),我平時寫一些醜陋的代碼是這樣的:

public void func(obj a) { 
    if(a instanceof someClass && ((someClass)a).hasSomeProperty() && ((someClass)a).getIdentifier().equals("myID")) { 
    // set a breakpoint here 
    } 
    // other code 
} 

所以基本上我試圖通過識別傳遞給函數的對象識別有趣的情況。我知道這些值,因爲我通常在其他代碼中引發的異常上有斷點。所以我的問題是:不是編寫所有這些難看的代碼來生成適當的斷點,有沒有一種方法可以根據某個變量在以前的調試會話中具有的某個值來配置條件斷點?基本上說:當物體完全像這裏一樣時,停在這裏?

回答

3

您不妨做到以下幾點:寫一個靜態工具方法(「編寫器」),用於序列化和寫入要與將來的調試會話進行比較的對象;和另一種方法(「讀者」)接收一個對象並將其與序列化版本進行比較,當兩者相等時返回true。
之後,您可以定義一個或多個調用「writer」方法並且不停止的條件斷點。
此外,您還需要定義另一個調用「reader」方法的條件斷點,它像通常那樣暫停線程,但只有在條件滿足時纔會停止。

+0

+1非常優雅的解決方案。我可以看到,在試圖停止任何複雜的變量(數組)或對象時,這在調試時很有用。 – Jeff

2

Netbeans提供了條件斷點功能:在一行上設置斷點後,右鍵單擊它,選擇斷點屬性,選擇條件複選框並插入Java代碼以表達一個必須爲真以斷開程序執行的條件。

+0

這是我想用的,但因爲這似乎是一個非常普遍的問題,我寧願希望這段代碼可以自動生成... – BennyBarns

+0

我絕對不能明白你的觀點,對不起。 – remigio

0

添加斷點,右鍵單擊它,去斷點 - 在斷點屬性窗口中,你會看到一個狀態對話框>性能 ,和你添加如果