3

我正在Microsoft Visual C#2008 Express Edition中編寫多線程Windows應用程序。最近,調試器一直在奇怪地行事。爲什麼Microsoft Visual C#2008速成版調試器隨機退出?

當我使用F10跨越代碼行時,有時它會像繼續命令(F5)一樣解釋我的Step Over(F10)命令,然後程序將繼續運行並完成調試會話。

有誰知道爲什麼會發生這種情況? Step Over命令會在什麼情況下導致調試器停止運行?

調試的代碼不是問題:它不僅發生在特定的代碼行上。它發生在每次運行調試器時不同的隨機行上。

這不是我的鍵盤問題:同樣的事情發生時,我只需點擊調試工具欄中的跳過。

這可能是我的程序中的其他線程的問題。也許其中之一是隨機做一些有中斷調試器的副作用。那可能嗎?

在此先感謝!

回答

4

你應該看看這個KB article並考慮它的匹配修補程序。

編輯:修補程序確實解決了這些類型的調試問題。不幸的是,該修補程序的源代碼更改沒有將其重新帶回到主分支,而VS2010也出現了完全相同的問題。這再次通過其Service Pack 1糾正。

+0

謝謝!我沒有機會確認此修補程序的工作原理,但似乎應該是因爲他們提到了我遇到的完全相同的問題。 – 2009-04-22 19:22:06

4

我已經看過幾次了。它通常發生在有上下文切換到另一個線程時。因此,您可能正在通過ID 11的線程,您按F10,並且有一個先發制人的上下文切換,因此您現在正在線程ID 12上運行,因此Visual Studio快樂地允許代碼繼續。

有一些很好的調試技巧here

提示:打破只有當特定線程調用的方法:要設置每個線程斷點,需要唯一標識你給特定線程一個帶有Name屬性的名字。您可以通過創建條件表達式(如「ThreadToStopOn」== Thread.CurrentThread.Name)來設置線程的條件斷點。

您可以通過觀察變量「myThread」並在值窗口中輸入名稱值來手動更改監視窗口中的線程名稱。如果您沒有當前線程變量可以使用,則可以使用Thread.CurrentThread.Name來設置當前線程的名稱。 Thread類中還有一個私有整數變量DONT_USE_InternalThread,這對每個線程都是唯一的。您可以使用「線程」窗口訪問要停止的線程,並在「監視」窗口中輸入Thread.CurrentThread.DONT_USE_InternalThread以查看其值,以便創建正確的條件斷點表達式。

編輯:也有一些很好的提示here。我發現這一點通過搜索'視頻工作室在調試時防止線程切換'。

+1

快速版沒有「線程」窗口。不過,線程名稱的條件轉折點聽起來很有趣。 – 2008-11-22 06:12:50

1

我發現使用日誌文件處理多個線程時非常方便。

調試線程就像Huysenberg原則 - 仔細觀察,你會改變結果!