Visual Studio調試多線程應用程式
10.3.3 調試多線程應用程式
多線程應用程式是在給定的進程中有多於一個的線程在啟動並執行應用程式。預設情況下,每個運行應用程式的進程有至少一個執行線程。你也許建立多個線程來做平行處理。這可以顯著地提升效能,尤其在運行今天的多核處理器和超執行緒技術的時候。然而,多線程也帶來了更大的開銷。代碼變得更加複雜難寫且更難於調試。如果你曾寫過多線程應用程式,你就知道了。
幸好,Visual studio提供若干工具,使得該工作稍微容易一些。我們不在這裡介紹如何編寫多線程應用程式。而是介紹調試多線程應用程式時可用的調試選項。以下列出這些工具和特性。
偵錯工作階段期間在原始碼中查看線程;
用於查看進程、線程和標記的線程的Debug Location工具列;
用於處理應用程式中線程列表的Thread視窗;
允許你為單獨線程設定斷點的斷點過濾器。
讓我們更詳細地看一下這些特性中的每一項。
1. 發現和標記線程
Visual Studio允許你在應用程式的偵錯模式中可視化線程。當停在斷點的時候,應用程式會被暫停,你可以調試活動的線程。在這個時候,應用程式中的其他線程仍然存在。然而,它們也許不可見。要在調試菜單中看到它們,可以使用來自Debug菜單的Show Threads in Soure(在原始碼中顯示線程)選項,10-37所示。
選擇該選項將反白在代碼中存在的其他線程。偵錯工作階段期間,這些程式碼將為你反白在代碼視窗的指標空白邊緣。用於反白這些項的表徵圖看起來像兩條波浪線(或者裝飾線)。圖10-38給出了一個樣本。
|
圖10-37 在Source(原始碼) 選項中顯示/隱藏線程 |
注意,第29行左側的映像。它表示在你原始碼中該位置存線上程。滑鼠移至上方在這個指標會顯示該指標所引用的線程(或多條線程)。每條線程由它的ID號(在方括弧中)和名稱(如果有的話)表示。圖10-39給出了一個樣本。
提示 命名線程有助於你在調試的時候更好地識別它們。要命名一條線程,可以使用Threading命名空間。具體來說,調用Thread類的Name屬性。
既然你已經找到了一條線程,你也許會想要標記它以便進一步監控。這樣僅有助於把你要監控的和你不關心的線程進行分組。你可以在指標空白邊緣右側標記一條線程。右擊該指標並在操作功能表中選擇Flag(標記)選項可完成此操作。圖10-40給出了一個樣本。
同樣你可以取消標幟線程。你也可以在Tbread視窗直接標記線程。標記的線程在Tbread視窗和Debug Location工具列中提供了特殊的分組。接下來我們將介紹這些特性。
2. 管理調試進程和線程
你可以使用Debug Location工具列在正被調試的進程和這些進程中的線程之間進行切換。這個工具列10-41所示。左側是Process列表。這裡你可以選擇一個進程來查看關於該進程的詳細資料,包括正在執行的線程。但是,許多多線程應用程式都在單個進程中運行。
|
(點擊查看大圖)圖10-41 Debug Location工具列 |
工具列上的Thread列表顯示了所選進程的線程的列表。這個列表在圖10-41中被反白。注意,線程和它們的ID、名稱和標記指標一起顯示。你可以在這個列表中選擇一條線程來跳轉到和該線程相關的原始碼。如果沒有與所選線程相關的原始碼,該線程名在選中時將以紅色顯示。你可以通過切換Thread列表(顯示帶有兩個標記)右邊的第二個按鈕過濾這個列表,從而僅顯示標記的線程。右邊第一個按鈕僅標記(或取消標幟)當前的活動線程。最後,右側的列表顯示調用棧。調用棧中的活動棧幀就是在調試視窗(監看式視窗、局部視窗、自動視窗等)中顯示的部分。
你也可以在Threads視窗(Debug菜單、Windows、Threads)裡管理線程。這裡你將看到所有為給定的進程列出的線程。圖10-42給出了一個樣本。注意,該列表的左側顯示了標記的線程。這裡我們有應用程式範例中兩個標記的線程。還要注意到這些線程已經命名,這樣在Name欄中易於識別。
Threads視窗中有若干可用選項。它們在圖10-42的操作功能表中顯示。注意Switch to Thread(切換到線程)選項。它允許你切換到正被調試的活動線程。該活動線程線上程列表(在標記的右側)中用黃色箭頭指示。切換活動線程將在調試視窗中改變調試上下文和內容。你也可以使用該操作功能表來凍結(或者暫停)線程。這相當於掛起線程。
3. 基於特殊的線程中斷
你也可以決定去中斷基於調用線程的程式碼。要這麼做,設定一個斷點並選擇斷點篩選器(前面討論過)。圖10-43給出了一個樣本。你可以選擇基於線程ID或者它的名稱中斷。在這種情況下,該斷點將基於後一個選項來命中。當然,這要求你在代碼中為線程命名。