使用 Visual Studio 偵錯工具附加至執行中處理序

您可以將 Visual Studio 偵錯工具附加至本機或遠端電腦上執行的處理序。 執行處理序之後,請選取 [偵錯]>[附加至處理序],或在 Visual Studio 中按 Ctrl+Alt+p,並使用 [附加至處理序] 對話方塊將偵錯工具附加至處理序。

您可以使用 [附加至處理序] 來偵錯本機或遠端電腦上執行的應用程式、同時偵錯多個處理序、偵錯未在 Visual Studio 中建立的應用程式,或偵錯您未從 Visual Studio 啟動且附加偵錯工具的任何應用程式。 例如,如果您在沒有偵錯工具的情況下執行應用程式並遇到例外狀況,您接著可以將偵錯工具附加至執行應用程式並開始偵錯的處理序。

提示

不確定是否要使用 [附加至處理序] 來進行偵錯案例? 請參閱常見的偵錯案例

附加至本機電腦上執行中的處理序

若要快速重新附加至您先前附加的處理序,請參閱重新附加至處理序

若要附加至本機電腦上的處理序:

  1. 在 Visual Studio 中,選取 [偵錯]>[附加至處理序] (或按 Ctrl+Alt+P) 來開啟 [附加至處理序] 對話方塊。

  2. 檢查 [連線類型]

    在大部分情況下,您可以使用 [預設]。 某些案例可能需要不同的連線類型。 如需詳細資訊,請參閱本文中的其他章節或常見偵錯案例

  3. 將 [連線目標] 設為您的本機電腦名稱。

    Screenshot of the Attach to Process dialog box, with the connection target set to the local machine name.

    Screenshot of the Attach to Process dialog box, with the connection target set to the local machine name.

  4. 在 [可用的處理序] 清單中,尋找並選取您要附加的一或多個處理序。

    • 若要快速選取處理序,請在 [篩選處理序] 方塊中輸入其名稱或第一個字母。

    • 如果您不知道處理序名稱,請瀏覽清單,或參閱常見偵錯案例以查看一些常見的處理序名稱。

    提示

    當 [附加至處理序] 對話方塊開啟時,可以在背景中啟動和停止處理序,因此執行中處理序的清單不一定是最新的。 您可以隨時選取 [重新整理] 以查看目前的清單。

  5. 在 [附加至] 欄位中,確定已列出您打算偵錯的程式碼類型。 預設的 [自動] 設定適用於大部分的應用程式類型。

    如果您使用 [預設] 連線類型,可以手動選取您要附加的程式碼類型。 否則,可能會停用 [選取] 選項。

    若要手動選取程式碼類型:

    1. 按一下 [選取]。
    2. 在 [選取程式碼類型] 對話方塊中,選取 [偵錯這些程式碼類型]。 如果您在嘗試附加至清單中的處理序時發生失敗,您可以使用 [選取程式碼類型] 對話方塊來協助針對問題進行疑難排解
    3. 選取您要偵錯的程式碼類型。
    4. 選取 [確定]。
  6. 選取附加

提示

在有多個相同處理序的案例中,請使用 [標題] 資料行中的 [命令列] 資料行或 w3wp 處理序詳細資料來識別正確的處理序。

注意

您可以附加至多個應用程式以進行偵錯,但偵錯工具一次只能有一個使用中程式。 您可以在 Visual Studio [偵錯位置] 工具列或 [處理序] 視窗中設定使用中的應用程式。

附加至遠端電腦上的處理序

您也可以在 [附加至處理序] 對話方塊中選取遠端電腦、檢視在該電腦上執行的可用處理序清單,以及附加至一或多個處理序以進行偵錯。 遠端偵錯工具 (msvsmon.exe) 必須在遠端電腦上執行。 如需詳細資訊,請參閱遠端偵錯

如需偵錯已部署至 IIS 的 ASP.NET 應用程式完整指示,請參閱在遠端 IIS 電腦上對 ASP.NET 進行遠端偵錯

若要附加至遠端電腦上的執行中處理序:

  1. 在 Visual Studio 中,選取 [偵錯]>[附加至處理序] (或按 Ctrl+Alt+P) 來開啟 [附加至處理序] 對話方塊。

  2. 檢查 [連線類型]

    在大部分情況下,您可以使用 [預設]。 某些案例 (例如偵錯 Linux 或容器化應用程式) 需要不同的連線類型。 如需詳細資訊,請參閱本文中的其他章節或常見偵錯案例

  3. 在 [連線目標] 方塊中,使用下列其中一種方法選取遠端電腦:

    • 選取 [連線目標] 旁的下拉式箭號,然後從下拉式清單中選取電腦名稱稱。

    • 在 [連線目標] 方塊中輸入電腦名稱稱,然後按 Enter

      確認 Visual Studio 會將必要的連接埠新增至電腦名稱,其顯示的格式為:<遠端電腦名稱>:port

      注意

      如果您無法使用遠端電腦名稱稱進行連線,請嘗試使用 IP 和連接埠位址 (例如 123.45.678.9:4022)。 4026 是 Visual Studio 2022 遠端偵錯工具的預設連接埠。 如需其他遠端偵錯工具連接埠指派,請參閱遠端偵錯工具連接埠指派

      注意

      如果您無法使用遠端電腦名稱稱進行連線,請嘗試使用 IP 和連接埠位址 (例如 123.45.678.9:4022)。 4024 是 Visual Studio 2019 遠端偵錯工具的預設連接埠。 如需其他遠端偵錯工具連接埠指派,請參閱遠端偵錯工具連接埠指派

    • 選取 [連線目標] 方塊旁的 [尋找] 按鈕,以開啟 [遠端連線] 對話方塊。 [遠端連線] 對話方塊會列出本機子網路上或直接附加至電腦的所有裝置。 您可能需要在伺服器上開啟 UDP 連接埠 3702,才能探索遠端裝置。 選取您想要的電腦或裝置,然後按一下 [選取]

    注意

    [連線類型] 設定會在偵錯工作階段之間持續維持。 只有在成功偵錯與該目標的連線發生時,[連線目標] 設定才會在偵錯工作階段之間持續維持。

  4. 按一下 [重新整理] 填入 [可用的處理序] 清單。

    提示

    當 [附加至處理序] 對話方塊開啟時,可以在背景中啟動和停止處理序,因此執行中處理序的清單不一定是最新的。 您可以隨時選取 [重新整理] 以查看目前的清單。

  5. 在 [可用的處理序] 清單中,尋找並選取您要附加的一或多個處理序。

  6. 在 [附加至] 欄位中,確定已列出您打算偵錯的程式碼類型。 預設的 [自動] 設定適用於大部分的應用程式類型。

    如果您使用 [預設] 連線類型,可以手動選取您要附加的程式碼類型。 否則,可能會停用 [選取] 選項。

    若要手動選取程式碼類型:

    1. 按一下 [選取]。
    2. 在 [選取程式碼類型] 對話方塊中,選取 [偵錯這些程式碼類型]。 如果您在嘗試附加至清單中的處理序時發生失敗,您可以使用 [選取程式碼類型] 對話方塊來協助針對問題進行疑難排解
    3. 選取 [確定]。
  7. 選取附加

注意

您可以附加至多個應用程式以進行偵錯,但偵錯工具一次只能有一個使用中程式。 您可以在 Visual Studio [偵錯位置] 工具列或 [處理序] 視窗中設定使用中的應用程式。

在某些情況下,在遠端桌面 (終端機服務) 工作階段中進行偵錯時,[可使用的處理序] 清單並不會顯示所有可使用的處理序。 如果您是以具有有限使用者帳戶的使用者身分執行 Visual Studio,則 [可用的處理序] 清單將不會顯示工作階段 0 中執行的處理序。 工作階段 0 用於服務和其他伺服器處理序,包括 w3wp.exe。 可藉由使用系統管理員帳戶來執行 Visual Studio,或是從伺服器主控台 (而非終端機服務工作階段) 執行 Visual Studio,來解決這個問題。

如果這些解決方法都沒有效,則第三個選項是從 Windows 命令列執行 vsjitdebugger.exe -p <ProcessId> 以附加至處理序。 您可以使用 tlist.exe 來判斷處理序識別碼。 若要取得 tlist.exe,您可以從 WDK 和 WinDbg 下載來下載並安裝適用於 Windows 的偵錯工具。

附加至在 Azure App Service 上執行的 .NET Core 處理序 (Windows)

如果您要發佈至 Azure App Service (Windows),請參閱 在 Azure 上對 ASP.NET Core 進行遠端偵錯偵錯 Azure App Services 以取得指示。

附加至在 Azure App Service 上執行的 .NET Core 處理序 (Windows)

如果您要發佈至 Azure App Service (Windows),您會在發行設定檔中 [裝載] 底下的 [...] 功能表下找到 [附加偵錯工具] 選項。 Visual Studio 會嘗試將遠端偵錯工具附加至設定檔所發行的 Azure App Service 執行個體。

Screenshot of the Attach Debugger option from within the Publish summary page.

使用 SSH 附加至在 Linux 上執行的 .NET Core 處理序

如需詳細資訊,請參閱使用 SSH 在 Linux 上執行的遠端偵錯 .NET Core

附加至於 Docker 容器執行的處理序

從 Visual Studio 2019 開始,您可以將 Visual Studio 偵錯工具附加至 Docker 容器上執行的處理序。 如需了解 Linux .NET Core Docker 容器,請參閱附加至於 Linux Docker 容器執行的處理序。 如需了解 Windows Docker 容器,請參閱附加至於 Windows Docker 容器執行的處理序

重新附加至處理序

您可以選擇 [偵錯]>[重新附加至處理序] (Shift+Alt+P),以快速重新附加至先前附加的處理序。 當您選擇此命令時,偵錯工具會立即嘗試附加至您附加的最後一個處理序,方法是先嘗試比對先前的程序識別碼,如果失敗,則比對先前的處理序名稱。 如果找不到相符項目,或如果數個處理序具有相同的名稱,則會開啟 [附加至處理序] 對話方塊,讓您可以選取正確的處理序。

注意

從 Visual Studio 2017 開始,即可使用 [重新附加至處理序] 命令。

常見的偵錯案例

為了協助您判斷是否要使用 [附加至處理序],以及要附加的處理序,下表顯示一些常見的偵錯案例,並提供更多可用指示的附加。 (此清單並不完整。)

對於某些應用程式類型,例如通用 Windows 應用程式 (UWP) 應用程式,您不會直接附加至處理序名稱,而是改為在 Visual Studio 中使用 [偵錯已安裝的應用程式套件] 功能表選項 (請參閱表格)。

偵錯工具若要附加至以 C++ 撰寫的程式碼,該程式碼必須發出 DebuggableAttribute。 您可以使用 /ASSEMBLYDEBUG 連結器選項連結,將其自動加入程式碼。

針對用戶端指令碼偵錯,必須在瀏覽器中啟用指令碼偵錯。 若要在 Chrome 上偵錯用戶端指令碼,請選擇 [JavaScript] 或 [TypeScript] 做為程式碼類型,且視您的應用程式類型而定,您可能需要關閉所有 Chrome 執行個體,並在偵錯模式中啟動瀏覽器 (從命令列輸入 chrome.exe --remote-debugging-port=9222)。

針對用戶端指令碼偵錯,必須在瀏覽器中啟用指令碼偵錯。 若要在 Chrome 上偵錯用戶端指令碼,請選擇 [JavaScript (Chrome)] 或 [JavaScript (Microsoft Edge - Chromium)] 做為程式碼類型,且視您的應用程式類型而定,您可能需要關閉所有 Chrome 執行個體,並在偵錯模式中啟動瀏覽器 (從命令列輸入 chrome.exe --remote-debugging-port=9222)。 在舊版 Visual Studio 中,Chrome 的指令碼偵錯工具是 Web 套件

若要快速選取要附加的執行中處理序,請在 Visual Studio 中輸入 Ctrl+Alt+P,然後輸入處理序名稱的第一個字母。

案例 Debug 方法 程序名稱。 附註和連結
ASP.NET Core - IIS 伺服器上的遠端偵錯 使用遠端工具和 [附加至處理序] w3wp.exedotnet.exe 從 .NET Core 3 開始,w3wp.exe 處理序會用於預設的應用程式內主控模型。 如需了解應用程式部署,請參閱發佈至 IIS。 如需詳細資訊,請參閱在遠端 IIS 電腦上對 ASP.NET Core 進行遠端偵錯
ASP.NET Core - 在不使用偵錯工具的情況下啟動應用程式之後,於本機電腦上進行偵錯 使用 [附加至處理序] msedge.exe 這可能有助於讓您的應用程式載入更快,例如分析時。
ASP.NET 4 或 4.5 - IIS 伺服器上的遠端偵錯 使用遠端工具和 [附加至處理序] w3wp.exe 請參閱在遠端 IIS 電腦上對 ASP.NET 進行遠端偵錯
用戶端指令碼 - 針對支援的應用程式類型,在本機 IIS 伺服器上進行偵錯 使用 [附加至處理序] chrome.exemsedge.exe 必須啟用指令碼偵錯。 針對 Chrome,您也必須以偵錯模式執行 Chrome (從命令列輸入 chrome.exe --remote-debugging-port=9222),然後在 [附加至] 欄位中選取 [JavaScript] 或 [TypeScript]
C#、Visual Basic 或 C++ 應用程式 - 本機電腦上的偵錯 使用標準偵錯 (F5) 或 [附加至處理序] <appname>.exe 在大部分情況下,請使用標準偵錯,而不是 [附加至處理序]
Windows 傳統型應用程式 - 遠端偵錯 遠端工具 N/A 請參閱遠端偵錯 C# 或 Visual Basic 應用程式遠端偵錯 C++ 應用程式
Linux 上的 .NET Core - 偵錯 使用 [附加至處理序] dotnet.exe 或唯一的處理序名稱 若要使用 SSH,請參閱使用 SSH 遠端偵錯 Linux 上執行的 .NET Core。 如需了解容器化應用程式,請參閱附加至在 Docker 容器中執行的處理序
容器化應用程式 - 偵錯 使用 [附加至處理序] dotnet.exe 或唯一的處理序名稱 請參閱附加至在 Docker 容器中執行的處理序
Linux 上的 Python - 遠端偵錯 使用 [附加至處理序] debugpy 請參閱從 Python 工具遠端附加
其他支援的應用程式類型 - 在伺服器處理序上進行偵錯 如果伺服器是遠端的,請使用遠端工具,並 [附加至處理序] chrome.exemsedge.exe 或其他處理序 如有必要,請使用資源監視器來協助識別處理序。 請參閱遠端偵錯
通用 Windows 應用程式 (UWP)、OneCore、HoloLens 或 IoT 應用程式 - 遠端偵錯 針對已安裝的應用程式套件進行偵錯 N/A 請參閱偵錯已安裝的應用程式套件,而不是使用附加至處理序
通用 Windows 應用程式 (UWP)、OneCore、HoloLens 或 IoT - 對未從 Visual Studio 啟動的應用程式進行偵錯 針對已安裝的應用程式套件進行偵錯 N/A 請參閱偵錯已安裝的應用程式套件,而不是使用附加至處理序

使用偵錯工具功能

若要在附加至處理序時使用 Visual Studio 偵錯工具的完整功能 (例如點擊中斷點),應用程式必須完全符合您的本機來源和符號。 也就是說,偵錯工具必須能夠載入正確的符號 (.pdb) 檔案。 根據預設,這需要偵錯組建。

針對遠端偵錯案例,您必須在 Visual Studio 中開啟原始程式碼 (或原始程式碼複本)。 遠端電腦上的已編譯應用程式二進位檔必須來自與本機電腦上相同的組建。

在某些本機偵錯案例中,如果應用程式存在正確的符號檔,則您可以在 Visual Studio 中偵錯,而無法存取來源。 根據預設,這需要偵錯組建。 如需詳細資訊,請參閱指定符號和來源檔案

疑難排解附加錯誤

在某些情況下,偵錯工具可能需要協助,才能正確識別要偵錯的程式碼類型。 如果連線值已正確設定 (您可以在 [可用的處理序] 清單中檢視正確的處理序),但偵錯工具無法附加,請嘗試在 [連線類型] 清單中選取最適當的連線類型,例如,如果您要偵錯 Linux 或 Python 應用程式,則可能是必要的。 如果您使用預設連線類型,則也可以選取要連線的特定程式碼類型,如本節稍後所述。

當偵錯工具附加至執行中的處理序時,該處理序可以包含一種或多種程式碼類型。 偵錯工具可附加的程式碼類型會在 [選取程式碼類型] 對話方塊中顯示並供您選取。

有時候,偵錯工具可以成功附加至一種程式碼類型,而無法附加至另一種程式碼類型。 一般而言,這會發生於:

  • 您嘗試附加至遠端電腦上執行的處理序。 遠端電腦可能為某些程式碼類型安裝了遠端偵錯元件,但沒有安裝其他程式碼類型的遠端偵錯元件。
  • 您嘗試附加至兩個或多個處理序以進行直接的資料庫偵錯。 (SQL 偵錯僅支援附加至單一處理序)。

如果偵錯工具能附加至某些程式碼類型 (而非所有程式碼類型),您可能會看到識別無法附加之類型的訊息。

如果偵錯工具成功附加到至少一種程式碼類型,您可以繼續偵錯該處理序。 您只能偵錯已附加成功的程式碼類型。 處理序中未連結的程式碼仍會執行,但您將無法設定中斷點、檢視資料,或在該程式碼上執行其他偵錯作業。

如果您需要更多相關資訊以了解偵錯工具無法附加至程式碼類型的原因,可以嘗試重新附加至該程式碼。

取得程式碼類型為何無法附加的相關資訊:

  1. 與處理序中斷連結。 在 [偵錯] 功能表上,選取 [全部中斷連結]

  2. 重新附加至處理序,只選取無法附加的程式碼類型。

    1. 在 [附加至處理序] 對話方塊的 [可使用的處理序] 清單中,選取該處理序。

    2. 選取選取

    3. 在 [選取程式碼類型] 對話方塊中,選取 [偵錯這些程式碼類型] 以及之前附加失敗的程式碼類型。 取消選取其他程式碼類型。

    4. 選取 [確定]。

    5. 在 [附加至處理序] 對話方塊中,選取 [附加]

    這時,該附加將完全失敗,您將取得特定的錯誤訊息。