2012-07-10 23 views
1

自從一段時間以來,我已經調查過這個問題,對我來說,普通斷點的位置顯着影響程序的運行時行爲似乎很明顯。在VS2010中放置斷點會影響程序的運行時行爲嗎?

我在這裏談到條件斷點,例如當將斷點條件設置爲var == null時,這種情況從不會發生,但是當我刪除斷點時,經常發生的情況是var == null

難道那是?

附錄:

那麼我的代碼是多線程的,所以很難以重現錯誤發佈代碼。基本上我有兩個線程。一個是將隊列中的項目排隊,另一個是永久隊列隊列中的項目。在下面的代碼片段中,我有第一個線程永遠不會列入空項的情況,但由於某種原因,他們正在尋找進入隊列的方式。這讓我插入if語句,以防止NullReferenceException。雖然作爲一個臨時的解決方案,我的程序從那時開始運行。然後我感興趣的是一個空項目從隊列中出列的頻率,並且我在條件爲inv == null的if語句的行中放置了一個條件斷點。現在的效果是,當存在斷點時,inv永遠不會爲null,並且在沒有斷點時,inv似乎通常爲null。

public void _dequeue() { 

      while (!Signals.TerminateSignal.WaitOne(0, false)) { 

       if (Signals.DequeueSignal.WaitOne()) { 

        lock (Queue) { 

         IInvocation inv; 
         Queue.TryDequeue(out inv); 

         // Conditional Breakpoint 
         if (inv != null) 
          inv.Invoke(); 

         _poolHooks[PoolIndex].DecrementWaiting(); 
         _poolHooks[PoolIndex].IncrementPending(); 

         if (Queue.Count == 0) Signals.DequeueSignal.Reset(); 

        } 
       } 
      } 
     } 

再次我的問題開始時,隊列中的某些項目開始是空項目,雖然我從來沒有添加空項目。即使因爲這個原因,我已經放置了一條在拋出異常的時候拋出異常的行。 Exception永遠不會被拋出,但我的隊列中仍然有空項目,我不知道爲什麼。

public static void EnqueueInvocation (int poolIndex, IInvocation inv) { 

     if (inv == null) throw new Exception("Red Alert"); 

     lock (_deqThreads[poolIndex].Queue) { 

      _poolHooks[poolIndex].IncrementWaiting(); 


      _deqThreads[poolIndex].Queue.Enqueue(inv); 
      _deqThreads[poolIndex].Signals.DequeueSignal.Set(); 
     } 
    } 
+0

發佈您的代碼。讓我們看看我們是否可以重現錯誤。 – GrayFox374 2012-07-10 17:33:18

+0

@ GrayFox374請參考上面的附錄。 – 2012-07-10 17:46:19

+0

謝謝,更多信息幾乎總是好的。如果您正在運行沒有斷點的應用程序,您如何確定隊列中的空值?如果這個例外從未被拋出,即使有斷點,也許它不在正確的位置。手錶顯示在觀察列表中? – GrayFox374 2012-07-10 18:03:20

回答

10

「條件斷點」肯定會影響計時。如果你有競爭條件,它肯定會改變行爲。你也可以開始看到超時。

這是因爲在大多數處理器上沒有真正的「條件斷點」。你實際上有什麼是「斷點,有條件地通過自動恢復執行」,即使條件不滿足,這也非常緩慢,因爲調試器斷點處理程序必須運行,讀取內存,測試條件,然後發出繼續。


現在你已經發布你的代碼,我想我看到了問題。

您沒有檢查TryDequeue的返回值。當沒有任何出隊時,inv將是null,不是因爲null被放入隊列中,而是因爲沒有任何項目在隊列中。

+0

我在流浪爲什麼有條件的斷點很慢。你的回答似乎是可行的。你能提供任何資源嗎? – gwiazdorrr 2012-07-10 17:40:47

+1

@gwiazdorrr:[Right here](http://msdn.microsoft.com/en-us/library/7sye83ce.aspx)該文檔解釋說:「斷點條件是**調試器評估的**表達式,當達到了斷點。「這就清楚地表明,條件是通過一個單獨的過程在軟件中進行評估的。 – 2012-07-10 17:44:38

+0

太棒了,搶+1! – gwiazdorrr 2012-07-11 08:18:31

1

這些斷點不應該影響您的代碼執行(除了減慢標記的代碼行)。你確定你沒有意外寫var = null或類似的東西嗎?這也可能是一些與時間相關的問題(例如,你的代碼速度較慢,所以很少出現多線程情況/競態條件),但最終很難說 - 至少這不是一般問題或缺點,只是由於使用這些。

+0

否我已經明確寫了'var == null',它嚴重影響變量'var'的內容(無論是否爲null )。 @BenVoigt在他上面的帖子中所說的話對我來說聽起來也是可以想象的,但是我的斷點對整個執行的影響非常高,所以我不確定我在這裏遇到了什麼效果。 – 2012-07-10 17:33:31

1

無論我在哪裏設置斷點,我都沒有看到x在評估行爲上的差異。

static void Main(string[] args) 
    { 
     var x = new object(); 
     if (x == null) 
     { Console.WriteLine("x is null"); } 
     else 
     { Console.WriteLine(x.ToString()); } 
     x = null; 
     if (x == null) 
     { Console.WriteLine("x is null"); } 
     else 
     { Console.WriteLine(x.ToString()); } 
    } 

System.Object的
x是空

相關問題