逐步解說:偵錯多執行緒應用程式
這個主題適用於:
Visual Studio 版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
|||||
Pro、Premium 和 Ultimate |
Visual Studio 2010 改進了 [執行緒] 視窗以及其他使用者介面,更容易進行多執行緒應用程式的偵錯。 只需花幾分鐘完成這份逐步解說,您便能更熟悉對多執行緒應用程式偵錯時的新介面功能。
開始本逐步解說之前,您需要一個多執行緒應用程式。 請依照下列步驟建立專案。
若要建立逐步解說專案
在 [檔案] 功能表上,選擇 [新增],然後按一下 [專案]。
[新增專案] 對話方塊隨即出現。
在 [專案類型] 方塊中按一下您所要的程式語言:[Visual Basic]、[Visual C#] 或 [Visual C++]。
在 [範本] 方塊中選擇 [主控台應用程式] 或 [CLR 主控台應用程式]。
在 [名稱] 方塊中,輸入名稱 [ MyThreadWalkthroughApp]。
按一下 [確定]。
新的主控台專案隨即出現。 專案建立之後,便會出現原始程式檔 (Source File)。 根據您所選擇的語言,原始程式檔的名稱可能是 Module1.vb、Program.cs 或 MyThreadWalkthroughApp.cpp
刪除出現在原始程式檔中的程式碼,並且以出現在建立執行緒並在啟動時間傳遞資料主題之<建立執行緒>一節中的範例程式碼來取代。
在 [檔案] 功能表上按一下 [全部儲存]。
若要開始逐步解說
在來源視窗中,尋找下列程式碼:
Thread.Sleep(3000) Console.WriteLine(
Thread.Sleep(3000);
Console.WriteLine();
Thread::Sleep(3000);
Console.WriteLine();
若要啟動偵錯
以滑鼠右鍵按一下 Console.WriteLine 陳述式,指向 [中斷點],然後按一下 [插入中斷點]。
來源視窗左邊的裝訂邊中會出現紅色圓球。 這表示這個位置現在已設定中斷點。
按一下 [偵錯] 功能表上的 [開始偵錯]。
偵錯作業啟動,您的主控台應用程式 (Console Application) 開始執行,然後在中斷點停止。
如果目前焦點在主控台應用程式視窗上,請按一下 Visual Studio 視窗將焦點還給 Visual Studio。
在來源視窗中,尋找包含下列程式碼的那一行:
Thread.Sleep(5000)
Thread.Sleep(3000);
Thread::Sleep(3000);
若要尋找執行緒標記
以滑鼠右鍵按一下 [執行緒] 視窗,然後按一下 [在原始程式檔中顯示執行緒]。
查看來源視窗左邊的裝訂邊。 在這條線上,您會看見有個像是兩條布條的圖示。 其中一條是紅色、另一條是藍色。 執行緒標記表示執行緒會停在這個位置上。 執行緒可能會停在這個位置上。
將指標移到執行緒標記上。 資料提示方塊隨即出現。 資料提示方塊會指出每個已停止的執行緒的名稱和執行緒 ID 編號。 此案例中只有一個執行緒,其名稱可能為 <noname>。
以滑鼠右鍵按一下執行緒標記。 請注意捷徑功能表上的選項。
這個圖示是「執行緒標記」(Thread Marker):
將執行緒加上旗標和取消旗標
在 Visual Studio 2008 中,您可以為需要特別注意的執行緒加上旗標。 為執行緒加上旗標可方便您追蹤重要的執行緒,而忽略您無需注意的執行緒。
若要為執行緒加上旗標
在 [檢視] 功能表上,指向 [工具列]。
確定已選取 [偵錯位置] 工具列。
移至 [偵錯位置] 工具列,並按一下 [執行緒] 清單。
注意事項 您可以藉由三個明顯的清單辨認出這個工具列:[處理序]、[執行緒] 和 [堆疊框架]。
注意清單中出現的執行緒數。
返回來源視窗,再次以滑鼠右鍵按一下 [執行緒] 標記。
在捷徑功能表上,按一下 [旗標],然後按一下執行緒名稱和 ID 編號。
返回 [偵錯位置] 工具列,並按一下 [執行緒] 清單。
現在清單中只會出現加上旗標的執行緒。 旗標按鈕就位於 [執行緒] 清單的右側。 按鈕上的旗標圖示先前呈現暗灰色。 現在成為亮紅色。
將指標移到旗標圖示上。
快顯視窗隨即出現。 這個快顯視窗會指出 [執行緒] 清單所處的模式:[僅顯示有旗標的執行緒]。
按一下旗標按鈕切換回 [顯示所有執行緒] 模式。
再按一下 [執行緒] 清單,確認您現在又可看見所有執行緒。
按一下旗標按鈕,切換回 [僅顯示有旗標的執行緒]。
在 [偵錯] 功能表上,指向 [視窗],然後按一下 [執行緒]。
[執行緒] 視窗隨即出現。 每個執行緒都附有一個明顯的旗標圖示。
在來源視窗中,再次以滑鼠右鍵按一下執行緒標記。
請注意捷徑功能表上目前可用的選項。 您現在會看到 [取消旗標],而不是 [旗標]。 請不要點選 [取消旗標]。
進入關於如何取消執行緒之旗標的下一個程序。
若要取消執行緒的旗標
在 [執行緒] 視窗中,以滑鼠右鍵按一下加上旗標的執行緒所對應的一行。
捷徑功能表即會顯示。 其中包含 [取消旗標] 和 [取消所有旗標] 兩個選項。
若要取消執行緒的旗標,請按一下 [取消旗標]。
按一下紅色旗標圖示。
再次查看 [偵錯位置] 工具列。 旗標按鈕再次呈現為暗灰色。 您已將唯一有旗標的執行緒取消旗標。 由於沒有已加上旗標的執行緒,工具列回到 [顯示所有執行緒] 模式。 按一下 [執行緒] 清單,確認您可看見所有執行緒。
返回 [執行緒] 視窗,並查看資訊欄。
每欄頂端的按鈕大都有用來識別該欄的標題。 但左側的第一欄沒有標題。 但它具有圖示,這個圖示為旗標的外框。 您會在執行緒清單的每一列注意到同樣的外框。 這個外框表示這個執行緒已經取消旗標了。
分別按一下兩個執行緒 (清單底端倒數第二和第三個) 的外框。
旗標圖示會成為紅色,而非空心的外框。
按一下旗標欄位頂端的按鈕。
按一下這個按鈕,執行緒清單的順序就會變更。 執行緒清單現在的排序是將加上旗標的執行緒列於最上方。
再按一下旗標欄位頂端的按鈕。
排序順序會再次變更。
執行緒視窗的相關資訊
若要進一步了解執行緒視窗
在 [執行緒] 視窗中,查看左邊算來第三個欄位。 這個欄位頂端的按鈕文字是 [ID]。
按一下 [ID]。
執行緒清單現在會依照執行緒 ID 編號排序。
以滑鼠右鍵按一下清單中任一個執行緒。 在捷徑功能表上按一下 [十六進位顯示]。
執行緒 ID 編號的格式即會變更。
將滑鼠指標移到清單中的任一執行緒上。
稍等一下,資料提示方塊就會出現。 它會顯示執行緒的部分呼叫堆疊。
查看左邊算來第四個欄位,這個欄位已加上 [分類] 標籤。 執行緒已分到這些類別中。
處理序中第一個建立的執行緒稱為主執行緒。 請在執行緒清單中找出這個執行緒。
以滑鼠右鍵按一下主執行緒,然後按一下 [切換至執行緒]。
警告對話方塊隨即出現。 警告中指出 Visual Studio 無法顯示主執行緒的原始程式碼。
按一下 [確定]。
查看 [呼叫堆疊] 視窗和 [偵錯位置] 工具列。
[呼叫堆疊] 視窗的內容已變更。
切換使用中執行緒
若要切換執行緒
在 [執行緒] 視窗中,查看左邊算來第二個欄位。 這個欄位頂端的按鈕沒有文字或圖示。 這個欄位是 [使用中執行緒] 欄位。
查看 [使用中執行緒] 欄位,並注意其中一個執行緒具有黃色箭號。 這是「使用中執行緒指示器」(Active Thread Indicator)。
記下使用中執行緒指示器所在的執行緒 ID 編號。 您會將使用中執行緒指示器移至其他執行緒,但您必須在完成作業後將其放回。
以滑鼠右鍵按一下另一個執行緒,然後按一下 [切換至執行緒]。
查看來源視窗中的 [呼叫堆疊] 視窗。 內容已有所變更。
查看 [偵錯位置] 工具列。 使用中執行緒也已變更。
移至 [偵錯位置] 工具列。 按一下 [執行緒] 方塊,然後從下拉式清單 (Drop-Down List) 中選擇不同的執行緒。
查看 [執行緒] 視窗。 使用中執行緒指示器已有所變更。
在來源視窗中,以滑鼠右鍵按一下執行緒標記。 在捷徑功能表上,指向 [切換至],然後按一下執行緒名稱/ID 編號。
您現在已了解三種可變更使用中執行緒的方法:使用 [執行緒] 視窗、[偵錯位置] 工具列的 [執行緒] 方塊,以及來源視窗中的執行緒指示器。
使用執行緒指示器時,您只能切換到停止在特定位置的執行緒。 使用 [執行緒] 視窗和 [偵錯位置] 工具列時,則可以切換至任何執行緒。
凍結和解除凍結執行緒的執行
若要凍結和解除凍結執行緒
在 [執行緒] 視窗中,以滑鼠右鍵按一下任何執行緒,然後按一下 [凍結]。
查看使用中執行緒欄位。 該處現在會出現一對垂直列。 這兩條藍色列表示該執行緒已遭凍結。
查看 [暫止] 欄位。 執行緒的暫停次數 (Suspend Count) 現在是 1。
以滑鼠右鍵按一下凍結的執行緒,然後按一下 [解除凍結]。
使用中執行緒欄位和 [暫止] 欄位即會變更。