逐步解說:偵錯多執行緒應用程式
更新:2007 年 11 月
這個主題適用於:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express 版 |
||||
Standard 版 |
||||
Pro/Team 版 |
表格圖例:
套用 |
|
不套用 |
|
預設隱藏的命令。 |
Visual Studio 2008 改進了 [執行緒] 視窗以及其他使用者介面,更容易進行多執行緒應用程式的偵錯。只需花幾分鐘完成這份逐步解說,您便能更熟悉對多執行緒應用程式偵錯時的新介面功能。
開始本逐步解說之前,您需要一個多執行緒應用程式。請依照下列步驟建立專案。
若要建立逐步解說專案
在 [檔案] 功能表上,選擇 [新增],然後按一下 [專案]。
[新增專案] 對話方塊隨即出現。
在 [專案類型] 方塊中按一下您所要的程式語言:[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 無法顯示主執行緒的原始程式碼。
按一下 [確定]。
查看 [呼叫堆疊] 視窗和 [偵錯位置] 工具列。
[呼叫堆疊] 視窗的內容已變更。此外在 [偵錯位置] 工具列上,[執行緒] 和 [堆疊框架] 方塊的內容皆會以紅色顯示。這表示其內容最近有所變更。
切換使用中執行緒
若要切換執行緒
在 [執行緒] 視窗中,查看左邊算來第二個欄位。這個欄位頂端的按鈕沒有文字或圖示。這個欄位是 [使用中執行緒] 欄位。
查看 [使用中執行緒] 欄位,並注意其中一個執行緒具有黃色箭號。這是「使用中執行緒指示器」。
記下使用中執行緒指示器所在的執行緒 ID 編號。您會將使用中執行緒指示器移至其他執行緒,但您必須在完成作業後將其放回。
以滑鼠右鍵按一下另一個執行緒,然後按一下 [切換至執行緒]。
查看來源視窗中的 [呼叫堆疊] 視窗。內容已有所變更。
查看 [偵錯位置] 工具列。使用中執行緒也已變更。
移至 [偵錯位置] 工具列。按一下 [執行緒] 方塊,然後從下拉式清單 (Drop-Down List) 中選擇不同的執行緒。
查看 [執行緒] 視窗。使用中執行緒指示器已有所變更。
在來源視窗中,以滑鼠右鍵按一下執行緒標記。在快速鍵功能表上,指向 [切換至],然後按一下執行緒名稱/ID 編號。
您現在已了解三種可變更使用中執行緒的方法:使用 [執行緒] 視窗、[偵錯位置] 工具列的 [執行緒] 方塊,以及來源視窗中的執行緒指示器。
使用執行緒指示器時,您只能切換到停止在特定位置的執行緒。使用 [執行緒] 視窗和 [偵錯位置] 工具列時,則可以切換至任何執行緒。
凍結和解除凍結執行緒的執行
若要凍結和解除凍結執行緒
在 [執行緒] 視窗中,以滑鼠右鍵按一下任何執行緒,然後按一下 [凍結]。
查看使用中執行緒欄位。該處現在會出現一對垂直列。這兩條藍色列表示該執行緒已遭凍結。
查看 [暫止] 欄位。執行緒的暫停次數 (Suspend Count) 現在是 1。
以滑鼠右鍵按一下凍結的執行緒,然後按一下 [解除凍結]。
使用中執行緒欄位和 [暫止] 欄位即會變更。