在 [平行堆疊] 視窗中檢視執行緒和工作 (C#、Visual Basic、C++)
[平行堆疊] 視窗對於偵錯多執行緒應用程式很有用。 其有數個檢視:
執行緒檢視會顯示應用程式中所有執行緒的呼叫堆疊資訊。 您可以在執行緒與這些執行緒上的堆疊框架之間瀏覽。
工作檢視會顯示以工作為中心的呼叫堆疊資訊。
- 在受控程式碼中,[工作] 檢視會顯示 System.Threading.Tasks.Task 物件的呼叫堆疊。
- 在機器碼中,[工作] 檢視會顯示工作群組、平行演算法、非同步代理程式和輕量型工作的所有呼叫堆疊。
方法檢視會轉向所選取方法上的呼叫堆疊。
使用平行堆疊視窗
若要開啟 [平行堆疊] 視窗,您必須在偵錯工作階段中。 選取 [偵錯]>[視窗]>[平行堆疊]。
工具列控制項
[平行堆疊] 視窗具有下列工具列控制項:
圖示 | 控制 | 描述 |
---|---|---|
執行緒/工作下拉式方塊 | 切換執行緒呼叫堆疊檢閱和工作呼叫堆疊檢閱。 如需詳細資訊,請參閱工作檢視和執行緒檢視。 | |
僅顯示有旗標的項目 | 只針對其他偵錯工具視窗 (例如 [GPU 執行緒] 視窗和 [平行監看式] 視窗) 中加上旗標的執行緒顯示呼叫堆疊。 | |
切換方法檢視 | 在呼叫堆疊檢視和方法檢視之間切換。 如需詳細資訊,請參閱方法檢視。 | |
自動捲動到目前堆疊框架 | 自動捲動圖表,讓目前堆疊框架位於檢視中。 當您從其他視窗變更目前的堆疊框架時,或當您在大型圖表中叫用新的中斷點時,這項功能很有用。 | |
切換縮放控制 | 顯示或隱藏視窗左邊的縮放控制項。 不論縮放控制項的可見性為何,您也可以進行縮放,方法是按 Ctrl 並轉動滑鼠滾輪,或按 Ctrl+Shift++ 來放大和按 Ctrl+Shift+- 來縮小。 |
圖示 | 控制 | 描述 |
---|---|---|
執行緒/工作下拉式方塊 | 切換執行緒呼叫堆疊檢閱和工作呼叫堆疊檢閱。 如需詳細資訊,請參閱工作檢視和執行緒檢視。 | |
篩選控制項 | 僅顯示您感興趣的特定執行緒集的呼叫堆疊。 | |
僅顯示有旗標的項目 | 只針對其他偵錯工具視窗 (例如 [GPU 執行緒] 視窗和 [平行監看式] 視窗) 中加上旗標的執行緒顯示呼叫堆疊。 | |
切換方法檢視 | 在呼叫堆疊檢視和方法檢視之間切換。 如需詳細資訊,請參閱方法檢視。 | |
自動捲動到目前堆疊框架 | 自動捲動圖表,讓目前堆疊框架位於檢視中。 當您從其他視窗變更目前的堆疊框架時,或當您在大型圖表中叫用新的中斷點時,這項功能很有用。 | |
切換縮放控制 | 顯示或隱藏視窗左邊的縮放控制項。 不論縮放控制項的可見性為何,您也可以進行縮放,方法是按 Ctrl 並轉動滑鼠滾輪,或按 Ctrl+Shift++ 來放大和按 Ctrl+Shift+- 來縮小。 |
|
搜尋控制項 | 透過這項功能,您可以輕鬆地搜尋整個堆疊框架,然後使用箭號在這些結果之間瀏覽。 | |
儲存控制項 | 可讓您將平行堆疊視窗中的內容儲存/匯出為影像。 | |
顯示外部程式碼控制項 | 使用這項功能,您可以顯示/隱藏來自外部程式碼/程式庫的堆疊。 |
堆疊框架圖示
下列圖示提供所有檢視中使用中和目前堆疊框架的相關資訊:
Icon | 描述 |
---|---|
指出目前執行緒的目前位置 (使用中堆疊框架)。 | |
指出非目前執行緒的目前位置 (使用中堆疊框架)。 | |
指出目前的堆疊框架 (目前的偵錯工具內容)。 無論其出現位置,方法名稱都是粗體。 |
Icon | 描述 |
---|---|
指出目前執行緒的目前位置 (使用中堆疊框架)。 | |
指出非目前執行緒的目前位置 (使用中堆疊框架)。 | |
指出目前的堆疊框架 (目前的偵錯工具內容)。 方法名稱無論出現在哪裡都是粗體的。 | |
指出目前的堆疊框架具有嚴重狀態警告,例如死結。 | |
指出死結節點。 | |
指出目前的堆疊框架具有其他資訊,例如正在等候、正在等候鎖定、擁有者等。 | |
指出目前工作處於已封鎖/正在等候狀態等。 | |
指出目前正在執行的工作。 |
操作功能表項目
以滑鼠右鍵按一下 [執行緒] 檢視或 [工作 ] 檢視中的方法時,可以使用下列捷徑功能表項目。 最後六個項目與 [呼叫堆疊] 視窗中的項目相同。
功能表項目 | 描述 |
---|---|
旗標 | 將選取的項目加上旗標。 |
取消旗標 | 取消所選取項目的旗標。 |
凍結 | 將選取的項目凍結。 |
解除凍結 | 將選取的項目解除凍結。 |
切換至框架 | 與 [呼叫堆疊] 視窗中對應的功能表命令相同。 不過,在 [平行堆疊] 視窗中,一種方法可能位於數個框架中。 您可以在此項目的子功能表中選取您所需的框架。 如果其中一個堆疊框架位於目前的執行緒上,預設會在子功能表中選取該框架。 |
移至工作或移至執行緒 | 切換至 [工作] 或 [執行緒] 檢視,並將相同的堆疊框架保持醒目提示狀態。 |
移至原始程式碼 | 移至原始程式碼視窗中的對應位置。 |
前往反組譯碼 | 移至 [反組譯碼] 視窗中的對應位置。 |
顯示外部程式碼 | 顯示或隱藏外部程式碼。 |
十六進位顯示 | 切換十進位和十六進位顯示。 |
在原始程式檔中顯示執行緒 | 將原始程式碼視窗中執行緒的位置加上旗標。 |
符號載入資訊 | 開啟 [符號載入資訊] 對話方塊。 |
符號設定 | 開啟 [符號設定] 對話方塊。 |
功能表項目 | 描述 |
---|---|
複製 | 複製選取的項目。 |
選取下方的所有框架 | 選取所選堆疊下的所有框架。 |
旗標 | 將選取的項目加上旗標。 |
取消旗標 | 取消所選取項目的旗標。 |
凍結 | 將選取的項目凍結。 |
解除凍結 | 將選取的項目解除凍結。 |
切換至框架 | 與 [呼叫堆疊] 視窗中對應的功能表命令相同。 不過,在 [平行堆疊] 視窗中,一種方法可能位於數個框架中。 您可以在此項目的子功能表中選取您所需的框架。 如果其中一個堆疊框架位於目前的執行緒上,預設會在子功能表中選取該框架。 |
移至工作或移至執行緒 | 切換至 [工作] 或 [執行緒] 檢視,並將相同的堆疊框架保持醒目提示狀態。 |
移至原始程式碼 | 移至原始程式碼視窗中的對應位置。 |
前往反組譯碼 | 移至 [反組譯碼] 視窗中的對應位置。 |
顯示外部程式碼 | 顯示或隱藏外部程式碼。 |
十六進位顯示 | 切換十進位和十六進位顯示。 |
在原始程式檔中顯示執行緒 | 將原始程式碼視窗中執行緒的位置加上旗標。 |
符號載入資訊 | 開啟 [符號載入資訊] 對話方塊。 |
符號設定 | 開啟 [符號設定] 對話方塊。 |
執行緒檢視
在 [執行緒] 檢視中,目前執行緒的堆疊框架和呼叫路徑會以藍色醒目提示。 執行緒的目前位置是由黃色箭號顯示。
若要變更目前的堆疊框架,請按兩下不同的方法。 這也可能會切換目前的執行緒,取決於您選取的方法是目前執行緒還是其他執行緒的一部分。
當 [執行緒] 檢視圖表太大而無法放入視窗時,[鳥瞰檢視] 控制項會出現在視窗中。 您可以移動控制項中的框架,以瀏覽至圖表的不同部分。
下圖顯示從主要到受控再到機器碼轉換的執行緒。 有六個執行緒在目前方法中。 一個會繼續至 Thread.Sleep、另一個會繼續至 Console.WriteLine,然後再至 SyncTextWriter.WriteLine。
下表描述 [執行緒] 檢視的主要功能:
圖說文字 | 元素名稱 | 描述 |
---|---|---|
1 | 呼叫堆疊區段或節點 | 包含一個或多個執行緒的一系列方法內容。 如果框架沒有與其連線的箭號線,框架會顯示執行緒的整個呼叫路徑。 |
2 | 藍色醒目提示 | 表示目前執行緒的呼叫路徑。 |
3 | 帶箭號的線條 | 連接節點,以構成執行緒的整個呼叫路徑。 |
4 | 節點標頭 | 顯示節點的流程和執行緒數目。 |
5 | 方法 | 表示相同方法中的一個或多個堆疊框架。 |
6 | 方法上的工具提示 | 將滑鼠停留在方法上時,即會出現。 在 [執行緒] 檢視中,工具提示會在類似 [執行緒] 視窗的表格中顯示所有執行緒。 |
下圖顯示從主要到受控再到機器碼轉換的執行緒。 有五個執行緒在目前方法中。 一個會繼續至 ServerClass.InstanceMethod、另一個會繼續至 Worker.Thread.Start,然後再至 StartupHook.Initialize.AnonymousMethod。
下表描述 [執行緒] 檢視的主要功能:
圖說文字 | 元素名稱 | 描述 |
---|---|---|
1 | 呼叫堆疊區段或節點 | 包含一個或多個執行緒的一系列方法內容。 如果框架沒有與其連線的箭號線,框架會顯示執行緒的整個呼叫路徑。 |
2 | 藍色醒目提示 | 表示目前執行緒的呼叫路徑。 |
3 | 帶箭號的線條 | 連接節點,以構成執行緒的整個呼叫路徑。 |
4 | 節點標頭 | 顯示節點的流程/執行緒數目、執行緒名稱和執行緒識別碼。 |
5 | 方法 | 表示相同方法中的一個或多個堆疊框架。 |
6 | 方法上的工具提示 | 將滑鼠停留在方法上時,即會出現。 在 [執行緒] 檢視中,工具提示會在類似 [執行緒] 視窗的表格中顯示所有執行緒。 |
工作檢視
如果您的應用程式使用 System.Threading.Tasks.Task 物件 (受控程式碼) 或 task_handle
物件 (機器碼) 來表示平行處理原則,您可以使用 [工作] 檢視。 [工作] 檢視會顯示工作 (而非執行緒) 的呼叫堆疊。
在 [工作] 檢視中:
- 執行緒若未執行工作,則不會顯示其呼叫堆疊。
- 執行緒若正在執行工作,則會在頂端和底部以視覺方式修剪其呼叫堆疊,以顯示工作的最相關框架。
- 當數個工作在一個執行緒上時,這些工作的呼叫堆疊會顯示在個別的節點中。
若要查看整個呼叫堆疊,請以滑鼠右鍵按一下堆疊框架,然後選取 [移至執行緒],切換回 [執行緒] 檢視。
下圖顯示頂端的 [執行緒] 檢視,以及底部的對應 [工作] 檢視。
將滑鼠停留在方法上,以顯示工具提示與其他資訊。 在 [工作] 檢視中,工具提示會在類似 [工作] 視窗的表格中顯示所有工作。
下圖顯示頂端 [執行緒] 檢視中方法的工具提示,以及底部對應 [工作] 檢視的工具提示。
方法檢視
從 [執行緒] 檢視或 [工作] 檢視中,您可以轉向目前方法的圖表,方法是選取工具列上的 [切換方法檢視] 圖示。 [方法檢視] 會顯示所有執行緒上所有呼叫目前方法,或由目前方法呼叫的方法。 下圖顯示相同資訊在左側 [執行緒] 檢視和右側 [方法] 檢視中的外觀。
如果切換到新的堆疊框架,您會使該方法成為目前的方法,而 [方法檢視] 會顯示新方法的所有呼叫者和被呼叫者。 有些執行緒可能會因此顯示或不見,視該方法是否出現在這些執行緒的呼叫堆疊中。 若要返回呼叫堆疊檢視,請重新選取 [方法檢視] 工具列圖示。
使用平行堆疊影片教學課程來偵錯執行緒和工作
這些影片教學課程示範如何使用 Visual Studio 2022 中 [平行堆疊] 視窗的 [執行緒] 和 [工作] 檢視,來偵錯多執行緒應用程式。