自從一段時間以來,我已經調查過這個問題,對我來說,普通斷點的位置顯着影響程序的運行時行爲似乎很明顯。在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();
}
}
發佈您的代碼。讓我們看看我們是否可以重現錯誤。 – GrayFox374 2012-07-10 17:33:18
@ GrayFox374請參考上面的附錄。 – 2012-07-10 17:46:19
謝謝,更多信息幾乎總是好的。如果您正在運行沒有斷點的應用程序,您如何確定隊列中的空值?如果這個例外從未被拋出,即使有斷點,也許它不在正確的位置。手錶顯示在觀察列表中? – GrayFox374 2012-07-10 18:03:20