在 [平行堆棧] 視窗中檢視線程和工作(C#、Visual Basic、C++)
平行堆疊 視窗對於偵錯多線程應用程式很有用。 它有數個觀點:
線程檢視 顯示應用程式中所有線程的呼叫堆棧資訊。 您可以在這些線程和它們的堆疊框架之間巡覽。
任務檢視 顯示以任務為中心的呼叫堆疊資訊。
- 在 Managed 程式碼中,任務 視圖會顯示 System.Threading.Tasks.Task 物件的呼叫堆疊。
- 在原生程式碼中,工作 檢視會顯示 工作群組、平行演算法、異步代理程式和 輕量型工作的呼叫堆疊。
方法檢視 將呼叫堆疊以所選方法為中心進行顯示。
使用 [平行堆疊] 視窗
若要開啟 平行堆疊 視窗,您必須在偵錯會話中。 選取 偵錯>視窗>平行堆疊。
工具列控件
平行堆疊 視窗具有下列工具列控制器:
圖示 | 控制 | 描述 |
---|---|---|
![]() |
執行緒/任務 組合框 | 切換線程呼叫堆疊與呼叫工作堆疊之間的檢視。 如需詳細資訊,請參閱 工作檢視 和 線程檢視。 |
![]() |
僅顯示已標記 | 僅針對其他調試程式中標幟的線程顯示呼叫堆棧,例如 GPU 線程 視窗和 平行監看 視窗。 |
![]() |
切換 方法檢視 | 在呼叫堆棧檢視和 方法檢視之間切換。 如需詳細資訊,請參閱 方法檢視。 |
![]() |
自動捲動至目前的堆疊框架 | 自動捲動畫面,以便目前的堆疊幀在視圖中顯示。 當您從其他視窗變更目前的堆疊框架,或當您在大型圖形中觸發新的斷點時,這項功能很有用。 |
![]() |
切換縮放控件 | 顯示或隱藏視窗左邊的縮放控件。 不論縮放控件的可見度為何,您也可以按 Ctrl 並翻轉滑鼠滾輪,或按 Ctrl+Shift++ 來放大,按 Ctrl+Shift+- 來縮小。 |
圖示 | 控制 | 描述 |
---|---|---|
![]() |
執行緒/任務 組合框 | 切換線程呼叫堆疊與呼叫工作堆疊之間的檢視。 如需詳細資訊,請參閱 工作檢視 和 線程檢視。 |
![]() |
篩選 控制 | 僅針對您感興趣的特定線程集顯示呼叫堆疊。 |
![]() |
僅顯示已標記 | 僅針對其他調試程式中標幟的線程顯示呼叫堆棧,例如 GPU 線程 視窗和 平行監看 視窗。 |
![]() |
切換 方法檢視 | 在呼叫堆棧檢視和 方法檢視之間切換。 如需詳細資訊,請參閱 方法檢視。 |
![]() |
自動捲動至目前的堆疊框架 | 自動捲動畫面,以便目前的堆疊幀在視圖中顯示。 當您從其他視窗變更目前的堆疊框架,或當您在大型圖形中觸發新的斷點時,這項功能很有用。 |
![]() |
切換縮放控件 | 顯示或隱藏視窗左邊的縮放控件。 不論縮放控件的可見度為何,您也可以按 Ctrl 並翻轉滑鼠滾輪,或按 Ctrl+Shift++ 來放大,按 Ctrl+Shift+- 來縮小。 |
![]() |
搜尋控件 | 透過這項功能,您可以輕鬆地搜尋堆疊框架,然後使用箭號在這些結果之間巡覽。 |
![]() |
儲存控制件 | 可讓您將平行堆疊視窗中的內容儲存/匯出為影像。 |
![]() |
顯示外部程式碼控件 | 使用這項功能,您可以從外部程式代碼/連結庫顯示/隱藏堆棧。 |
![]() |
彙整呼叫堆疊資訊 | 從 Visual Studio 2022 版本 17.13 Preview 4 開始,一旦安裝並啟用了 Copilot,您可以選擇 摘要。 此按鈕會開啟 [Copilot Chat] 視窗,預先載入相關的線程內容,讓您探索詳細數據,包括線程狀態、函數調用和建議的修正程式。 |
堆疊框架圖示
下列圖示提供有關各檢視中作用中及目前堆疊框架的資訊:
圖示 | 描述 |
---|---|
![]() |
指出當前線程的目前位置(活動堆疊框架)。 |
![]() |
指出目前不在執行中的線程的活動位置(活動堆疊框架)。 |
![]() |
表示目前的堆疊框架(目前的調試程序內容)。 無論其出現位置,方法名稱都是粗體。 |
圖示 | 描述 |
---|---|
![]() |
指出當前線程的目前位置(活動堆疊框架)。 |
![]() |
指出目前不在執行中的線程的活動位置(活動堆疊框架)。 |
![]() |
表示目前的堆疊框架(目前的調試程序內容)。 無論其出現位置,方法名稱都是粗體。 |
![]() |
指出目前的堆疊框架具有危急狀態警告,例如死結。 |
![]() |
表示死結節點。 |
![]() |
表示目前的堆疊框架有其他資訊,例如等候、等候鎖定、擁有者等。 |
![]() |
指出目前的工作處於封鎖/等候狀態等等。 |
執行中狀態 ![]() |
指出目前正在執行的工作。 |
內容選單項目
在 [線程] 檢視或 [工作] 檢視中,當您以滑鼠右鍵單擊某個方法時,可以使用下列捷徑選單項目。 最後六個項目與 呼叫堆疊視窗中的相同。
選單項目 | 描述 |
---|---|
旗標 | 標記選取的項目。 |
取消標記 | 取消選取的項目旗標。 |
凍結 | 凍結選取的項目。 |
解凍 | 解凍選取的項目。 |
切換至框架 | 與 呼叫堆疊 視窗中的對應功能表命令相同。 不過,在 平行堆疊 視窗中,一種方法可能位於數個框架中。 您可以在此項目的子選單中選取您想要的框架。 如果其中一個堆疊框架位於目前的線程上,該框架預設會在子功能表中選取。 |
移至工作 或 移至線程 | 切換至 任務 或 線程 檢視,並保持相同的堆疊框架突出。 |
前往原始程式碼 | 移至原始碼視窗中的對應位置。 |
移至反組譯碼 | 移至 反組譯碼 視窗中的對應位置。 |
顯示外部程式碼 | 顯示或隱藏外部程序代碼。 |
十六進位顯示 | 在十進位和十六進位顯示之間切換。 |
在來源 中顯示線程 | 將線程的位置標幟在原始程式碼視窗中。 |
符號載入資訊 | 開啟 [符號載入資訊] 對話框。 |
符號設定 | 開啟 [符號設定] 對話框。 |
選單項目 | 描述 |
---|---|
複製 | 複製選取的項目。 |
選取下方的所有框架 | 選取所選取堆疊下的所有框架。 |
旗標 | 標記選取的項目。 |
取消標記 | 取消選取的項目旗標。 |
凍結 | 凍結選取的項目。 |
解凍 | 解凍選取的項目。 |
切換至框架 | 與 呼叫堆疊 視窗中的對應功能表命令相同。 不過,在 平行堆疊 視窗中,一種方法可能位於數個框架中。 您可以在此項目的子選單中選取您想要的框架。 如果其中一個堆疊框架位於目前的線程上,該框架預設會在子功能表中選取。 |
移至工作 或 移至線程 | 切換至 任務 或 線程 檢視,並保持相同的堆疊框架突出。 |
前往原始程式碼 | 移至原始碼視窗中的對應位置。 |
移至反組譯碼 | 移至 反組譯碼 視窗中的對應位置。 |
顯示外部程式碼 | 顯示或隱藏外部程序代碼。 |
十六進位顯示 | 在十進位和十六進位顯示之間切換。 |
在來源 中顯示線程 | 將線程的位置標幟在原始程式碼視窗中。 |
符號載入資訊 | 開啟 [符號載入資訊] 對話框。 |
符號設定 | 開啟 [符號設定] 對話框。 |
線程檢視
在 執行緒 檢視中,目前執行緒的堆疊框架和呼叫路徑會以藍色突出顯示。 線程的目前位置是由黃色箭號顯示。
若要變更目前的堆疊框架,請雙擊不同的函式。 這也可能會切換目前的線程,視您選取的方法是否為目前線程或其他線程的一部分而定。
當 線程 檢視圖形太大而無法放入視窗時,視窗會出現 鳥眼檢視 控件。 您可以移動控件中的框架,以巡覽至圖形的不同部分。
下圖顯示一個線程,從 Main 到 Managed 到 Native 程式代碼轉換。 目前方法中有六個線程。 兩個線程會繼續執行 Thread.Sleep,兩個線程會繼續至 Console.WriteLine,而目前的線程會繼續同步處理TextWriter.WriteLine。
下表描述 線程 檢視的主要功能:
標註 | 元素名稱 | 描述 |
---|---|---|
1 | 呼叫堆疊 (Call Stack) 區段或節點 | 包含一或多個線程的一系列方法。 如果框架沒有與其連接的箭號線,框架會顯示線程的整個呼叫路徑。 |
2 | 藍色醒目提示 | 指出目前線程的呼叫路徑。 |
3 | 箭頭線 | 連接節點以構成線程的整個呼叫路徑。 |
4 | 節點標題 | 顯示節點的進程和線程數目。 |
5 | 方法 | 代表相同方法中的一或多個堆疊框架。 |
6 | 方法上的工具提示 | 當您將滑鼠停留在方法上時,會出現。 在 [線程] 檢視中,工具提示會顯示數據表中的所有線程,類似於 [線程] 視窗。 |
下圖顯示在託管到原生代碼轉換中的主線程。 目前方法中有五個線程。 在 S.C 方法內容中,四個線程繼續執行;而一個工作線程則持續於 Managed 到 Native 程式碼轉換過程中執行,並在該工作線程上設定名稱。
下表描述 線程 檢視的主要功能:
標註 | 元素名稱 | 描述 |
---|---|---|
1 | 呼叫堆疊 (Call Stack) 區段或節點 | 包含一或多個線程的一系列方法。 如果框架沒有與其連接的箭號線,框架會顯示線程的整個呼叫路徑。 |
2 | 藍色醒目提示 | 指出目前線程的呼叫路徑。 |
3 | 箭頭線 | 連接節點以構成線程的整個呼叫路徑。 |
4 | 節點標題 | 顯示節點的進程/線程、線程名稱和線程標識碼數目。 |
5 | 方法 | 代表相同方法中的一或多個堆疊框架。 |
6 | 方法上的工具提示 | 當您將滑鼠停留在方法上時,會出現。 在 [線程] 檢視中,工具提示會顯示數據表中的所有線程,類似於 [線程] 視窗。 |
7 | 線程描述 | AI 產生的線程描述。 從 Visual Studio 2022 17.13 版 Preview 1 開始,安裝並啟動 Copilot 時,會出現此描述。 |
任務視圖
如果您的應用程式使用 System.Threading.Tasks.Task 物件(Managed 程式碼)或 task_handle
物件(本機程式碼)以表達平行處理,您可以使用 工作 檢視。
工作 檢視會顯示工作的呼叫堆棧,而不是執行緒。
在 [任務] 檢視中:
- 未執行任務的線程堆疊不會被顯示。
- 呼叫正在執行工作的線程堆疊會以可視化方式修剪在頂端和底部,以顯示工作最相關的框架。
- 當數個工作在一個線程上時,這些工作的呼叫堆疊會顯示在不同的節點中。
若要查看整個呼叫堆疊,請在堆疊架構上按滑鼠右鍵,然後選取 [移至線程],以切換回 [線程] 檢視。
下圖顯示頂端 線程 檢視,以及底部對應的 工作 檢視。
將滑鼠停留在方法上,以顯示具有其他資訊的工具提示。 在 [工作] 檢視中,工具提示會顯示數據表中的所有工作,類似於 [工作] 視窗。
下圖顯示了在上方 線程 檢視中方法的工具提示,以及在下方對應的 工作 檢視中的工具提示。
方法視圖
從 [線程] 檢視或 [工作] 檢視中,您可以在工具列上選取 [切換方法檢視] 圖示,以變更目前方法的圖表視角。 方法檢視 可一目了然地顯示所有在所有線程中呼叫目前方法或被目前方法呼叫的方法。 下圖顯示相同信息在左側的 線程檢視 和右側的 方法檢視 中的外觀。
如果您切換到新的堆疊框架,您會將該方法設為目前的 方法,方法檢視 會顯示新方法的所有呼叫端和呼叫者。 這可能會導致某些線程顯示或從檢視中消失,視該方法是否出現在其呼叫堆棧上而定。 若要返回呼叫堆棧檢視,請再次選取 方法檢視 工具列圖示。
使用平行堆疊進行線程和任務偵錯的教學影片
這些影片教學課程示範如何使用 Visual Studio 2022 中平行堆疊視窗的 [線程和工作] 檢視來偵錯多線程應用程式。
相關內容
- 開始偵錯多線程應用程式
- 操作指南:偵錯平行應用程式
- 在 Visual Studio 偵錯時,切換到另一個線程
- 偵錯受控程式代碼
- 平行程序設計
- 使用 [工作] 視窗
- Task 類別