2008-11-13 69 views
3

我使用的方法稱爲最近幾萬次開始拋出異常。在大多數調試環境中,我會在此方法的頂部設置一個斷點,然後繼續運行,直到遇到我感興趣的調用觸發異常的參數值。在這種情況下這將是不切實際的,所以我試圖設置一個斷點,只有當該參數值出現時纔會斷開。我在下面的位置創建了一個斷點,並給它一個條件str == "OffendingValue"Visual Studio在使用斷點條件進行調試時行爲異常

class Foo 
{ 
    // Bar() is called many, many times 
    void Bar(string str) 
    { 
     try 
     { 
      // Breakpoint inserted here 
      ... 
     } 
     catch (Exception ex) 
     { 
      ... 
     } 
    } 
} 

令我驚訝的是,這樣做導致Visual Studio和我的應用程序在調試模式下停止工作。我的應用程序啓動並輸出一些簡單的日誌消息,但後來完全停止響應由於需要做更多的工作來監控斷點狀況,因此思考Visual Studio可能會稍微慢一點,我離開辦公桌15分鐘讓它有一段時間運行。當我回來時,沒有任何變化。我可以通過刪除斷點並以相同的條件重新創建條件來重現條件。最奇怪的是,當我有這個有問題的斷點時,Break All調試命令(通常會破壞當前正在執行它是否是斷點的語句上的程序執行)不會執行任何操作。

有沒有人遇到與Visual Studio斷點條件類似的行爲?我能夠毫無問題地使用命中計數條件。

回答

7

任何時候,我試圖在Visual Studio中使用條件斷點我有同樣的問題。調試器運行速度太慢,以至於無法使用。相反,我最終會臨時向代碼中添加一條if語句並在其中添加我的斷點。這並不方便,但代碼以正常的速度執行,它確實完成了工作。

class Foo 
{ 
    // Bar() is called many, many times 
    void Bar(string str) 
    { 
     try 
     { 

      if(str == "condition") 
      { 
       int i = 0; // Breakpoint inserted here 
      } 
      ... 
     } 
     catch (Exception ex) 
     { 
       ... 
     } 
    } 
} 
0

我不知道你是否得到堆棧溢出。 VS是否跟蹤str的所有值或任何與Bar的每個狀態有關的值?如果是這樣,成千上萬的副本可能會加起來。

我想知道是否可以通過全局變量而不是函數內的一個來消除監視值的問題。

2

如果您知道違規值是什麼,您是否可以不爲該方法編寫單元測試並以此方式進行調試?

如果沒有,如果您知道該異常,則可以將該調試器設置爲在引發該異常時中斷。轉到Debug |異常和檢查拋出異常的問題。

+0

這種方法在長時間的操作系列中取代了調用堆棧。我雖然沒有單獨爲這種方法編寫單元測試,但也許這是一個好方法。一個工作條件斷點將是最簡單的方法,這就是爲什麼我很好奇VS爲什麼不工作。 – Chris 2008-11-13 22:08:58

+0

我也發現一些VS的調試功能遇到問題時,他們被擊中太多次。我認爲VS只是落後於評估。因此,解決方法;) – 2008-11-14 14:31:07

相關問題