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