2011-11-18 60 views
25

我想在調試時只能跟蹤一個線程的執行。我使用線程池,因此調試器不斷在線程間切換,這使得調試非常不舒服。如何在Visual Studio中只調試一個線程

閱讀:

我得到一個解決方案,它是有條件的斷點(基於線程的名稱)。但是,我不能說「線程#3」總是處理有趣的情況,所以我將不得不改變每次執行的條件。太多工作。

另一種解決方案是使用凍結/解凍功能,只讓我感興趣的線程運行。但是,這會使某些信息不可用,因爲所有線程都已暫停。

我現在正在使用的是讓程序運行,直到我到達一個斷點,我肯定會處於良好的線程中。然後,我暫停所有其他線程池並嘗試恢復執行。如果程序似乎卡住了,我暫停並解凍當前線程。

理想的解決方案是找到正確的線程並將其標記,然後對Visual Studio說:「只在當前線程標記爲時中斷」。

這甚至可能嗎?

+0

那麼線程打入的標準是什麼? – abatishchev

+0

標準將停止線程被標記 – kamaradclimber

+0

單獨測試您的代碼。以單元測試爲例。然後,您只需要調試線程交互,即您不希望凍結線程的調試類型。 –

回答

2

我會使用你提到的條件斷點,而不是比較一些固定的字符串比較一些半全局變量(也許是你的主類的靜態屬性?)。

當您確定哪個線程變得有趣時,您可以使用立即窗口設置變量名稱並允許命中條件斷點。

+0

這將是可能的解決方案。但是我看到2個draback:我需要修改我的代碼來調試它,並且我需要通過一個(複雜的)斷點過程(1次點擊和1次點擊,複製過去,1次點擊) – kamaradclimber

+0

對於最近調試過的人(像我)建議閱讀這個[回答 詳細闡述此解決方法](http://stackoverflow.com/a/38926833/1348138)稍微進一步。我還建議投票[這裏提到的建議](http://stackoverflow.com/a/31191208/1348138)。 – robert4

6

在調試您可以凍結所有的線程的線程窗口和恢復只有你感興趣的人。

+3

謝謝,但它並沒有回答這個問題:我希望應用程序正常運行,並且只在一個線程中停止斷點。 – kamaradclimber

1

有點晚了,但這個突然出現在搜索第一個答案。

我使用VS 2015以下...

var thread = System.Threading.Thread.CurrentThread; 
if (thread.Name == null) 
      thread.Name = "Main"; 
在斷點

則...

System.Threading.Thread.CurrentThread.Name == "Main" 

爲了使其更加靈活,你可以在自定義類中嵌入主題。

僅供參考:您不能在條件斷點中使用靜態變量,因爲它們不在上下文中。從來沒有真正理解爲什麼靜態不總是在上下文中。

+0

感謝您的回答(甚至遲到)您會在哪裏添加第一段代碼來命名線程? (我已經提到將代碼添加到代碼中需要事先知道我想要遵循的主題) – kamaradclimber

+0

@kamaradclimber。儘快地。您只能設置一次線程名稱或存在異常。您可以在調試中手動設置thread.Name。你也可以說如果thread.name == xxx System.Diagnostics.Debugger.Break() – Paulustrious

+0

對不起。5分鐘超時。 @kamaradclimber。儘快地。您只能設置一次線程名稱或存在異常。您可以在調試中手動設置thread.Name,或者只是在System.Threading.Thread.CurrentThread.Name =「xyz」中設置。你也可以說... if(thread.name == xxx){System.Diagnostics.Debugger.Break();}。如果你願意,你可以給同一個名稱多個線程。在過去,我已經沿着bool stop = thread.Name ==「someName」的方向添加了代碼,然後在調試斷點處,您可以將條件設​​置爲「stop」。讓生活更輕鬆 – Paulustrious

相關問題