共用方式為


在 Visual Studio 中偵錯執行緒和處理序

「執行緒」(Thread) 和「處理序」(Process) 在電腦科學中是相關的概念。 兩者都代表必須以特定順序執行的指令序列。 但是,不同執行緒或處理序中的指令能夠平行執行。

處理序存在於作業系統中,並對應至所謂的程式或應用程式。 從另一方面來說,執行緒存在於處理序中。 基於這個原因,執行緒有時候會稱為「輕量處理序」(Light-Weight Process)。 每個處理序是由一或多個執行緒組成。

具有多個處理序能夠讓電腦同時執行一項以上的工作。 具有多個執行緒能夠讓處理序分割工作以平行方式執行。 使用多個處理器的電腦能夠在不同的處理器上執行處理序或執行緒。 如此可達到真正的平行處理。

但是並非都能達到完美的平行處理境界。 執行緒有時候必須進行同步處理。 一個執行緒可能需要等候其他執行緒的結果,或是一個執行緒可能需要其他執行緒正在使用之資源的獨佔存取權。 同步處理是多執行緒應用程式中發生錯誤的常見原因。 有時候執行緒會演變成一直在等候永遠無法使用的資源。 這會導致所謂的「死結」(Deadlock) 情況。

Visual Studio 偵錯工具提供強大而容易使用的工具以便偵錯執行緒和處理序。

Visual Studio 中偵錯執行緒和處理序的工具

在 [Visual Studio] 中使用處理序的主要工具是 [附加至處理序] 對話方塊、[處理序] 視窗和 [偵錯位置] 工具列。 偵錯執行緒使用的主要工具是 [執行緒] 視窗、來源視窗中的執行緒標記,以及 [偵錯位置] 工具列。

用於偵錯多執行緒應用程式的主要工具是 [平行堆疊] 和 [平行工作]、[平行監看式] 及 [GPU 執行緒] 視窗。

下表顯示在這些位置中可用的資訊與能夠執行的動作:

使用者介面

可用的資訊

能夠執行的動作

[附加至處理序] 對話方塊

能夠附加至的可用處理序:

  • 處理序名稱 (.exe)

  • 處理序 ID 編號

  • Menubar 標題

  • 型別 (Managed v4.0;Managed v2.0、v1.1、v1.0;x86;x64;IA64)

  • 使用者名稱 (帳戶名稱)

  • 工作階段編號

選取要附加至的處理序

選取遠端電腦

變更連接至遠端電腦的傳輸類型

[處理序] 視窗

附加之處理序:

  • 處理序名稱

  • 處理序 ID 編號

  • 處理序 .exe 的路徑

  • Menubar 標題

  • 狀態 (中斷. 執行)

  • 偵錯 (原生、Managed 等)

  • 傳輸類型 (預設、未經驗證的機器碼)

  • 傳輸限定詞 (遠端電腦)

工具:

  • 附加

  • 中斷連結

  • 結束

捷徑功能表:

  • 附加

  • 中斷連結

  • 當偵錯停止時中斷連結

  • 結束

[執行緒] 視窗

目前處理序中的執行緒:

  • 執行緒 ID

  • Managed ID

  • 分類 (主執行緒、介面執行緒、遠端程序呼叫處理常式或背景工作執行緒)

  • 執行緒名稱

  • 建立執行緒的位置

  • 優先權

  • 關連遮罩

  • 暫停計數

  • 處理序名稱

  • 旗標指標

  • 暫停指標

工具:

  • 搜尋

  • 搜尋呼叫堆疊

  • 將 Just My Code 加上旗標

  • 將自訂模組選取範圍加上旗標

  • 群組依據

  • Columns

  • 展開/摺疊呼叫堆疊

  • 展開/摺疊群組

  • 凍結/解除凍結執行緒

捷徑功能表:

  • 在原始程式檔中顯示執行緒

  • 切換至執行緒

  • 凍結執行中的執行緒

  • 解除凍結執行緒

  • 爲執行緒加上旗標以便做進一步研究

  • 取消執行緒的旗標

  • 重新命名執行緒

  • 顯示和隱藏執行緒

其他動作:

  • 在資料提示方塊中檢視執行緒的呼叫堆疊

來源視窗

左側巡覽邊上的執行緒指示器能指出是單一或多個執行緒 (預設為關閉,可使用 [執行緒] 視窗中的捷徑功能表開啟)。

捷徑功能表:

  • 切換至執行緒

  • 爲執行緒加上旗標以便做進一步研究

  • 取消執行緒的旗標

偵錯位置工具列

  • 目前的處理序

  • 顯示應用程式縮圖

  • 暫停應用程式

  • 繼續執行應用程式

  • 暫停並關閉應用程式

  • 目前的執行緒

  • 切換目前執行緒的旗標狀態

  • 僅顯示有旗標的執行緒

  • 僅顯示目前處理序

  • 目前的堆疊框架

  • 切換至另一個執行緒

  • 暫停、繼續或關閉應用程式

  • 切換至目前處理序中的另一個執行緒

  • 切換至目前執行緒中的另一個堆疊框架

  • 將目前執行緒加上旗標或取消旗標

  • 僅顯示有旗標的執行緒

  • 僅顯示目前處理序

[平行堆疊] 視窗

  • 一個視窗中多個執行緒的呼叫堆疊。

  • 每一個執行緒的作用中堆疊框架。

  • 任何方法的呼叫端和被呼叫端。

  • 篩選掉指定的執行緒

  • 切換至 [平行工作] 檢視

  • 將執行緒加上旗標或取消旗標

  • 縮放

[平行工作] 視窗

  • 檢視 Task 物件的相關資訊,包括工作 ID、工作狀態 (已排程、執行中、等待中、死結),以及指派給工作的執行緒。

  • 呼叫堆疊中的目前位置。

  • 在建立時傳遞至工作的委派

  • 切換至目前工作

  • 將工作加上旗標或取消旗標

  • 凍結或解除凍結工作

[平行監看式] 視窗

  • 旗標資料行,您可以在該資料行中標示想要特別注意的執行緒。

  • 框架資料行,其中的箭號表示選取的框架。

  • 可以顯示電腦、處理序、Tile、工作和執行緒的可設定資料行。

  • 將執行緒加上旗標或取消旗標

  • 僅顯示已標幟的執行緒

  • 切換框架

  • 排序資料行

  • 群組執行緒

  • 凍結或解除凍結執行緒

  • 匯出 [平行監看式] 視窗中的資料

GPU 執行緒視窗

  • 旗標資料行,您可以在該資料行中標示想要特別注意的執行緒。

  • 使用中執行緒資料行,其中黃色箭號表示使用中執行緒。 箭號表示執行進入偵錯工具的執行緒。

  • [執行緒計數] 資料行,顯示同一位置的執行緒數目。

  • [] 資料行,顯示每個執行緒群組所在的程式碼行。

  • [位址] 資料行,顯示每個執行緒群組所在的指令位址。

  • [位置] 資料行,是位址在程式碼中的位置。

  • [狀態] 資料行,顯示執行緒為使用中或已封鎖。

  • [] 資料行中,顯示資料列中執行緒的磚索引。

  • 變更為不同的使用中執行緒

  • 顯示特定磚和執行緒

  • 顯示或隱藏資料行

  • 依資料行排序

  • 群組執行緒

  • 凍結或解除凍結執行緒

  • 將執行緒加上旗標或取消旗標

  • 僅顯示已標幟的執行緒

請參閱

其他資源

使用 Visual Studio Debugger 附加至執行中處理序

在 Visual Studio 中偵錯多執行緒應用程式

偵錯 GPU 程式碼