Visual Studio 調試系列10 附加到正在運行的進程

  • 2019 年 10 月 4 日
  • 筆記

可將 Visual Studio 調試器附加到本地或遠程電腦上正在運行的進程。 進程運行後,在 Visual Studio 中選擇「調試」 > 「附加到進程」,或按 Ctrl+Alt+P,然後使用「附加到進程」對話框將調試器附加到進程。

可以使用「附加到進程」 來調試本地或遠程電腦上正在運行的應用、同時調試多個進程、 調試並非在 Visual Studio 中創建的應用或未使用附帶調試器從 Visual Studio 啟動的任何應用。 例如,如果運行的是不帶調試器的應用,並觸發異常,則可以將調試器附加到運行應用的進程並開始調試。

01 附加到本地電腦上正在運行的進程

若要附加到本地電腦上的進程,請執行以下操作:

  1. 在 Visual Studio 中,選擇「調試」 > 「附加到進程」(或按 Ctrl+Alt+P),打開「附加到進程」對話框。 「連接類型」應設置為「默認」。 「連接目標」應該是本地電腦名稱。
  1. 在「可用進程」列表中,查找並選擇要附加到的一個或多個進程。
    • 若要快速選擇一個進程,請在「篩選進程」框中鍵入其名稱或首字母。
    • 如果不知道進程名稱,請瀏覽列表或參閱常見調試方案,了解一些常見的進程名稱。

    「附加到進程」對話框處於打開狀態時,進程可以在後台啟動和停止,因此正在運行的進程列表可能不總是最新內容。 可隨時選擇「刷新」查看當前列表。

  2. 在「附加到」欄位中,確保已列出計劃調試的程式碼類型。 默認的「自動」設置適用於大多數應用類型。 若要手動選擇程式碼類型:
    1. 單擊「選擇」。
    2. 在「選擇程式碼類型」對話框中,選擇「調試這些程式碼類型」。
    3. 選擇你想要調試的程式碼類型。
    4. 選擇 確定。
  3. 選擇「附加」。

可附加到多個應用進行調試,但在調試器中一次只能有一個應用處於活動狀態。 可在 Visual Studio 的「調試位置」工具欄或「進程」窗口中設置活動的應用。

02 附加到遠程電腦上的進程

還可以在「附加到進程」對話框中選擇遠程電腦,查看該電腦上運行的可用進程列表,並附加到一個或多個進程以進行調試。 遠程調試器 (msvsmon.exe) 必須在遠程電腦上運行。 有關詳細資訊,請參閱遠程調試

用於調試已部署到 IIS 的 ASP.NET 應用程式的更完整說明,請參閱遠程調試遠程 IIS 電腦上的 ASP.NET

若要將附加到遠程電腦上正在運行的進程:

  1. 在 Visual Studio 中,選擇「調試」 > 「附加到進程」(或按 Ctrl+Alt+P),打開「附加到進程」對話框。
  2. 在大多數情況下,「連接類型」應為「默認」。 在「連接目標」框中,使用以下方法之一選擇遠程電腦:
    • 選擇下拉箭頭旁邊的「連接目標」,並從下拉列表中選擇電腦名稱。
    • 鍵入中的電腦名稱連接目標框,然後按Enter。 驗證 Visual Studio 將所需的埠添加到電腦名稱,將出現在格式: <遠程電腦名稱 >: 埠 如果您不能使用遠程電腦名稱進行連接,請嘗試使用 IP 和埠地址 (例如, 123.45.678.9:4022)。 4024 是 Visual Studio 2019 x64 遠程調試器的默認埠。 有關其他遠程調試器埠分配,請參閱遠程調試器埠分配。
    • 選擇查找按鈕旁邊連接目標框,以打開遠程連接對話框。 遠程連接對話框會列出本地子網上,或直接連接到您的電腦的所有設備。 你可能需要打開 UDP 埠 3702伺服器以發現遠程設備上。 選擇的電腦或所需的設備,然後單擊選擇。

    「連接類型」設置在調試會話之間保持不變。 而「連接目標」設置只有在成功與該目標建立了調試連接時才會在調試會話之間保持不變。

  3. 單擊「刷新」,填充「可用進程」列表。 「附加到進程」對話框處於打開狀態時,進程可以在後台啟動和停止,因此正在運行的進程列表可能不總是最新內容。 可隨時選擇「刷新」查看當前列表。
  4. 在「可用進程」列表中,查找並選擇要附加到的一個或多個進程。
  5. 在「附加到」欄位中,確保已列出計劃調試的程式碼類型。 默認的「自動」設置適用於大多數應用類型。 若要手動選擇程式碼類型:
    1. 單擊「選擇」。
    2. 在「選擇程式碼類型」對話框中,選擇「調試這些程式碼類型」。
    3. 選擇你想要調試的程式碼類型。
    4. 選擇 確定。
  6. 選擇「附加」。

在某些情況下,在遠程桌面(終端服務)會話中進行調試時,「可用進程」列表時不會顯示所有可用進程。 如果以受限制的用戶帳戶的用戶身份運行 Visual Studio,則「可用進程」列表不會顯示在會話 0 中運行的進程。 會話 0 用於服務和其他伺服器進程,包括 w3wp.exe。 可通過以下方法解決該問題:使用管理員帳戶運行 Visual Studio 或從伺服器控制台(而不是「終端服務」會話)運行 Visual Studio。

如果這兩種解決方法都不可行,第三種方法是通過從 Windows 命令行運行 vsjitdebugger.exe -p <ProcessId> 來附加到進程。 您可以確定進程 ID 使用tlist.exe。 若要獲取「tlist.exe」,請從 WDK 和 WinDbg 下載中下載並安裝適用於 Windows 的調試工具。

03 重新附加到進程

您可以快速重新附加到先前已通過選擇附加到的進程 「調試」 > 「重新附加到進程」(Shift+Alt+P)。 當選擇此命令時,調試器會立即嘗試附加到最後連接的進程,方法是首次嘗試匹配先前的進程 ID ,如果失敗,將匹配先前的進程名稱。 如果不找到任何匹配項,或多個進程具有相同的名稱,「附加到進程」 對話框將打開,這樣您就可以選擇正確的進程。

重新附加到進程命令是從 Visual Studio 2017 開始提供。

04 常見的調試方案

為幫助確定是否使用「附加到進程」以及要附加到的進程,下表顯示了一些常見調試方案,並提供了指向更多可用說明的鏈接。 (該列表並未列出詳盡資訊。)

對於某些應用類型,如通用 Windows 應用 (UWP) ,不能直接附加到進程名稱,而需使用 Visual Studio 中的「調試安裝的應用程式包」菜單選項(請參閱表格)。

為使調試器附加到用 C++ 編寫的程式碼,該程式碼需要發出 DebuggableAttribute。 可通過鏈接 /ASSEMBLYDEBUG 鏈接器選項將它自動添加到程式碼中。

對於客戶端腳本調試,必須在瀏覽器中啟用腳本調試。 對於調試在 Chrome 上的客戶端腳本,請選擇Web 工具包作為程式碼類型,並根據你的應用類型,可能需要關閉所有 Chrome 實例並在調試模式下啟動瀏覽器 (類型chrome.exe --remote-debugging-port=9222從命令行)。

若要快速選擇正在運行的進程來將附加到,在 Visual Studio 中,鍵入Ctrl+Alt+P,然後鍵入的第一個字母進程名稱。

方案

調試方法

進程名

說明和鏈接

遠程調試 ASP.NET 4 或 4.5 上 IIS 伺服器

使用遠程工具和附加到進程

w3wp.exe

請參閱遠程調試遠程 IIS 電腦上的 ASP.NET

IIS 伺服器上的遠程調試 ASP.NET Core

使用遠程工具和附加到進程

dotnet.exe

有關應用程式部署,請參閱發布到 IIS。 有關調試,請參閱遠程調試遠程 IIS 電腦上的 ASP.NET Core

調試客戶端腳本的本地 IIS 伺服器上,為受支援的應用類型

使用附加到進程

chrome.exe, MicrosoftEdgeCP.exe,或iexplore.exe

必須啟用腳本調試。對於 Chrome 中,也必須在調試模式下,選擇運行 Chrome Webkit 程式碼中附加到欄位。

調試C#,Visual Basic 或C++在本地電腦上的應用

使用任一標準調試 (F5) 或附加到進程

<appname>.exe

在大多數情況下,使用標準調試並不附加到進程。

遠程調試 Windows 桌面應用程式

遠程工具

不適用

請參閱遠程調試C#或 Visual Basic 應用程式或遠程調試C++應用程式

調試 ASP.NET 應用程式在本地電腦上,在啟動不帶調試器的應用後

使用附加到進程

iiexpress.exe

這可能會有所幫助使應用程式載入速度更快,如 (例如) 進行分析時。

調試伺服器進程上的其他受支援的應用類型

如果遠程伺服器,使用遠程工具和附加到進程

chrome.exe, iexplore.exe,或其他進程

如有必要,使用資源監視器來幫助標識該進程。 請參閱遠程調試。

遠程調試的通用 Windows 應用 (UWP)、 OneCore、 HoloLens 或 IoT 應用

調試安裝的應用包

不適用

請參閱調試安裝的應用包而不是使用附加到進程

調試未從 Visual Studio 啟動的通用 Windows 應用 (UWP)、 OneCore、 HoloLens 或 IoT 應用

調試安裝的應用包

不適用

請參閱調試安裝的應用包而不是使用附加到進程

05 使用調試器的功能

要在附加到流程時使用Visual Studio調試器的完整功能(如命中斷點),應用程式必須與本地源和符號完全匹配。也就是說,調試器必須能夠載入正確的符號(.pdb)文件。默認情況下,這需要調試版本。

對於遠程調試方案,您必須已在Visual Studio中打開源程式碼(或源程式碼的副本)。遠程電腦上編譯的app二進位文件必須來自與本地電腦上相同的版本。

在某些本地調試方案中,如果應用程式中存在正確的符號文件,則可以在Visual Studio中進行調試而無法訪問源。默認情況下,這需要調試版本。有關更多資訊,請參閱指定符號和源文件

06 排查附加錯誤

當調試器附加到一個正在運行的進程時,該進程可能包含一種或多種類型的程式碼。 可在 「選擇程式碼類型」 對話框中顯示並選擇可將調試器附加到的程式碼類型。

有時,調試器可以成功連接到一種程式碼類型,但不能連接到另一種程式碼類型。如果您嘗試連接到遠程電腦上運行的進程,則可能會發生這種情況。遠程電腦可能為某些程式碼類型安裝了遠程調試組件,但對其他程式碼類型則沒有。如果您嘗試連接到兩個或多個進程以進行直接資料庫調試,也會發生此問題。SQL調試僅支援附加到單個進程。

如果調試器能夠附加到某些(但不是所有)程式碼類型,您會看到一條消息,標識哪些類型無法附加。

如果調試器成功附加到至少一種程式碼類型,則可以繼續調試該過程。您將只能調試成功附加的程式碼類型。進程中未附加的程式碼仍將運行,但您將無法在該程式碼上設置斷點,查看數據或執行其他調試操作。

如果您需要有關調試器無法附加到程式碼類型的原因的更多具體資訊,請嘗試僅重新連接到該程式碼類型。

獲得有關程式碼類型未能附加的具體資訊:

  1. 從進程中分離。 上調試菜單中,選擇全部分離。
  2. 重新附加到進程,僅選擇程式碼類型未能附加。
    1. 在「附加到進程」對話框,選擇「可用進程」列表中的進程。
    2. 選擇選擇。
    3. 在 「選擇程式碼類型」 對話框中,選擇 「調試以下程式碼類型」 和未能附加的程式碼類型。取消選擇其他程式碼類型。
    4. 選擇 確定。
    5. 在中附加到進程對話框中,選擇附加。

    此時,附加將徹底失敗,並且你將收到一條特定的錯誤消息。