您可以將 Visual Studio 偵錯工具附加至本機或遠端電腦上執行中的進程。 進程執行之後,請選取 [偵錯>附加至進程 ] 或在 Visual Studio 中按 Ctrl+Alt+p ,然後使用 [附加至進程] 對話方塊將偵錯工具附加至進程。
您可以使用 [附加至進程 ] 來偵錯本機或遠端電腦上執行中的應用程式、同時偵錯多個進程、偵錯未在 Visual Studio 中建立的應用程式,或偵錯您未從 Visual Studio 啟動並附加偵錯工具的任何應用程式。 例如,如果您在沒有偵錯工具的情況下執行應用程式,但發生例外狀況,您可以將偵錯工具附加至執行應用程式的進程,並開始偵錯。
小提示
不確定是否要針對偵錯案例使用 附加至進程 ? 請參閱 常見的偵錯案例。
附加至本機電腦上正在執行的程序
若要快速重新附加至您先前附加的程序,請參閱 重新附加至程序。
從 Visual Studio 2022 17.10 版 Preview 2 開始,[附加至進程] 對話框已變更。 如果您需要符合舊對話框的指示,請切換至 Visual Studio 2019 檢視(文章中的左上方版本選取器)。
若要附加至本機電腦上的程序:
在 Visual Studio 中,選取 [偵錯>附加至進程 ] (或按 Ctrl+Alt+P) 以開啟 [附加至進程] 對話方塊。
將 連線類型 設定為 本機。
在大多數本機偵錯情境中,您可以使用 本機。 某些案例可能需要不同的連線類型。 如需詳細資訊,請參閱本文中的其他區段或 常見的偵錯案例。
在 [可用的程序 ] 清單中,尋找並選取您要附加的一或多個程序。
- 若要快速選取程序,請在 [篩選程序] 方塊中輸入其名稱或第一個字母。
- 如果您不知道程序名稱,請瀏覽清單,或參閱 常見的偵錯案例 以 取得一些常見的程序名稱。
- 使用 追蹤視窗 按鈕啟用在電腦上選擇一個窗口,從而設定該過程。
小提示
當 [附加至程序 ] 對話方塊開啟時,處理程序可以在背景啟動和停止,因此執行中的處理程序清單可能不一定是最新的。 您可以隨時選取 [重新整理] 以查看目前的清單。
在 [程式碼類型 ] 欄位中,請確定已列出您計劃偵錯的程式碼類型。
預設 的 [自動] 設定適用於大部分的應用程式類型,但您可以選取特定的程式碼類型來手動指定偵錯工具類型。
選取 ,附加。
小提示
在您有多個相同進程的情況下,請使用 [命令列] 資料行或 [標題] 資料行中的 w3wp 進程詳細資料來識別正確的進程。
在 Visual Studio 中,選取 [偵錯>附加至進程 ] (或按 Ctrl+Alt+P) 以開啟 [附加至進程] 對話方塊。
檢查 連線類型。
在大部分情況下,您可以使用預設。 某些案例可能需要不同的連線類型。 如需詳細資訊,請參閱本文中的其他區段或 常見的偵錯案例。
將 連線目標 設定為您的本機電腦名稱。
在 [可用的程序 ] 清單中,尋找並選取您要附加的一或多個程序。
若要快速選取程序,請在 [篩選程序] 方塊中輸入其名稱或第一個字母。
如果您不知道程序名稱,請瀏覽清單,或參閱 常見的偵錯案例 以 取得一些常見的程序名稱。
小提示
當 [附加至程序 ] 對話方塊開啟時,處理程序可以在背景啟動和停止,因此執行中的處理程序清單可能不一定是最新的。 您可以隨時選取 [重新整理] 以查看目前的清單。
在 [附加至] 欄位中,請確定已列出您計劃偵錯的程式碼類型。 預設 的「自動」 設定適用於大多數應用程式類型。
如果您使用 預設 連線類型,您可以手動選取要附加的程式碼類型。 否則,可能會停用「 選取」 選項。
若要手動選取程式碼類型:
選取 ,附加。
備註
您可以附加至多個應用程式進行偵錯,但偵錯工具中一次只有一個應用程式處於作用中狀態。 您可以在 Visual Studio 偵錯位置 工具列或 [進程] 視窗中設定作用中的應用程式。
附加至遠端電腦上的程序
您也可以在 [附加至進程] 對話方塊中選取遠端電腦、檢視該電腦上執行的可用進程清單,以及附加至一或多個進程進行偵錯。 遠端偵錯工具 (msvsmon.exe) 必須在遠端電腦上執行。 如需詳細資訊,請參閱 遠端偵錯。
從 Visual Studio 2022 17.10 版 Preview 2 開始,[附加至進程] 對話框已變更。 如果您需要符合舊對話框的指示,請切換至 Visual Studio 2019 檢視(文章中的左上方版本選取器)。
若要連線至遠端電腦上的執行程序:
在 Visual Studio 中,選取 [偵錯>附加至進程 ] (或按 Ctrl+Alt+P) 以開啟 [附加至進程] 對話方塊。
將 [連線類型] 設定為遠端連線類型,例如遠端 (Windows)。
在 Windows 上遠端偵錯的大部分案例中,您可以使用遠端(Windows)。 某些案例 (例如偵錯 Linux 或容器化應用程式) 需要不同的連線類型。 如需詳細資訊,請參閱本文中的其他區段或 常見的偵錯案例。
連線 目標選項 隨即顯示。
在 [連線目標] 方塊中,使用下列其中一種方法選取遠端電腦:
- 選取 [連線目標] 旁的下拉式清單箭號,然後從下拉式清單中選取電腦名稱。
- 在 [連線目標] 方塊中輸入電腦名稱,然後按 Enter 鍵。
- 選取 [連線目標] 方塊旁的 [尋找] 按鈕,以開啟 [遠端連線] 對話方塊。 [ 遠端連線] 對話方塊會列出本機子網路上或直接連接至電腦的所有裝置。 您可能需要在伺服器上 開啟出埠 UDP 埠 3702 ,才能探索遠端裝置。 選取您要的電腦或裝置,然後關閉對話方塊。
確認 Visual Studio 會將必要的埠新增至計算機名稱,其格式如下:<遠端電腦名稱>:埠
備註
如果您無法使用遠端電腦名稱進行連線,請嘗試使用 IP 和連接埠位址 (例如
123.45.678.9:4026)。 4026 是 Visual Studio 2022 遠端偵錯工具的預設埠。 如需其他遠端偵錯工具埠指派,請參閱 遠端偵錯工具埠指派。連線類型設定會在偵錯工作階段之間持續存在。 只有在與該目標發生成功的偵錯連線時,連線 目標 設定才會在偵錯會話之間持續存在。
按一下 重新整理 以填入 可用處理程序 清單。
小提示
當 [附加至程序 ] 對話方塊開啟時,處理程序可以在背景啟動和停止,因此執行中的處理程序清單可能不一定是最新的。 您可以隨時選取 [重新整理] 以查看目前的清單。
在 [可用的程序 ] 清單中,尋找並選取您要附加的一或多個程序。
若要快速選取程序,請在程序搜尋方塊中輸入其名稱或第一個字母。
如果您不知道程序名稱,請瀏覽清單,或參閱 常見的偵錯案例 以 取得一些常見的程序名稱。
若要尋找在所有使用者帳戶下執行的進程,請選取 [ 顯示所有使用者的進程 ] 核取方塊。
備註
如果您嘗試連接到不受信任的使用者帳戶所擁有的程序,則會出現安全警告對話方塊要求確認。 如需詳細資訊,請參閱安全性警告:附加至不受信任的使用者所擁有的進程可能很危險。如果以下資訊看起來可疑或您不確定,請不要附加到此過程。
在 [程式碼類型 ] 欄位中,請確定已列出您計劃偵錯的程式碼類型。
預設 的 [自動] 設定適用於大部分的應用程式類型,但您可以選取特定的程式碼類型來手動指定偵錯工具類型。
選取 ,附加。
在 Visual Studio 中,選取 [偵錯>附加至進程 ] (或按 Ctrl+Alt+P) 以開啟 [附加至進程] 對話方塊。
檢查 連線類型。
在大部分情況下,您可以使用預設。 某些案例 (例如偵錯 Linux 或容器化應用程式) 需要不同的連線類型。 如需詳細資訊,請參閱本文中的其他區段或 常見的偵錯案例。
在 [連線目標] 方塊中,使用下列其中一種方法選取遠端電腦:
- 選取 [連線目標] 旁的下拉式清單箭號,然後從下拉式清單中選取電腦名稱。
- 在 [連線目標] 方塊中輸入電腦名稱,然後按 Enter 鍵。
- 選取 [連線目標] 方塊旁的 [尋找] 按鈕,以開啟 [遠端連線] 對話方塊。 [ 遠端連線] 對話方塊會列出本機子網路上或直接連接至電腦的所有裝置。 您可能需要在伺服器上 開啟出埠 UDP 埠 3702 ,才能探索遠端裝置。 選取您想要的電腦或裝置,然後選取 [選取]。
確認 Visual Studio 會將必要的埠新增至計算機名稱,其格式如下:<遠端電腦名稱>:埠
備註
如果您無法使用遠端電腦名稱進行連線,請嘗試使用 IP 和連接埠位址 (例如
123.45.678.9:4022)。 4024 是 Visual Studio 2019 遠端偵錯工具的預設埠。 如需其他遠端偵錯工具埠指派,請參閱 遠端偵錯工具埠指派。連線類型設定會在偵錯工作階段之間持續存在。 只有在與該目標發生成功的偵錯連線時,連線 目標 設定才會在偵錯會話之間持續存在。
按一下 重新整理 以填入 可用處理程序 清單。
小提示
當 [附加至程序 ] 對話方塊開啟時,處理程序可以在背景啟動和停止,因此執行中的處理程序清單可能不一定是最新的。 您可以隨時選取 [重新整理] 以查看目前的清單。
在 [可用的程序 ] 清單中,尋找並選取您要附加的一或多個程序。
若要快速選取程序,請在 [篩選程序] 方塊中輸入其名稱或第一個字母。
如果您不知道程序名稱,請瀏覽清單,或參閱 常見的偵錯案例 以 取得一些常見的程序名稱。
若要尋找在所有使用者帳戶下執行的進程,請選取 [ 顯示所有使用者的進程 ] 核取方塊。
備註
如果您嘗試連接到不受信任的使用者帳戶所擁有的程序,則會出現安全警告對話方塊要求確認。 如需詳細資訊,請參閱安全性警告:附加至不受信任的使用者所擁有的進程可能很危險。如果以下資訊看起來可疑或您不確定,請不要附加到此過程。
在 [附加至] 欄位中,請確定已列出您計劃偵錯的程式碼類型。 預設 的「自動」 設定適用於大多數應用程式類型。
如果您使用 預設 連線類型,您可以手動選取要附加的程式碼類型。 否則,可能會停用「 選取」 選項。
若要手動選取程式碼類型:
選取 ,附加。
備註
您可以附加至多個應用程式進行偵錯,但偵錯工具中一次只有一個應用程式處於作用中狀態。 您可以在 Visual Studio 偵錯位置 工具列或 [進程] 視窗中設定作用中的應用程式。
在某些情況下,當您在遠端桌面 (終端機服務) 會話中偵錯時, [可用的進程 ] 清單不會顯示所有可用的進程。 如果您以具有有限使用者帳戶的使用者身分執行 Visual Studio,則 [ 可用的進程 ] 清單不會顯示在工作階段 0 中執行的進程。 會話 0 用於服務和其他伺服器進程,包括 w3wp.exe。 您可以在系統管理員帳戶下執行 Visual Studio,或直接從伺服器主控台執行 Visual Studio,而不是通過遠端桌面工作階段來解決問題。
如果這些因應措施都無法實現,則第三個選項是從 Windows 命令列執行 vsjitdebugger.exe -p <ProcessId> 來附加至進程。 您可以使用 tlist.exe來判斷處理程序 ID 。 若要取得 tlist.exe,請下載並安裝適用於 Windows 的偵錯工具,可在 WDK 和 WinDbg 下載取得。
附加至 Azure App Service (Windows) 上執行的 .NET Core 進程
如果您要發佈至 Azure App Service (Windows),請參閱 Azure 上的遠端偵錯 ASP.NET Core 或 偵錯 Azure App Service 以取得指示。
附加至 Azure App Service (Windows) 上執行的 .NET Core 進程
如果您要發佈至 Azure App Service (Windows),您會在發佈設定檔中 [裝載] 底下的 [...] 功能表下找到 [附加偵錯工具] 選項。 Visual Studio 會嘗試將遠端偵錯工具附加至設定檔要發佈至的 Azure App Service (Windows) 執行個體。
使用 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 容器上的程序。
重新附加至程序
您可以選擇 Debug> (Shift+Alt+P) 來快速重新連接至先前連接的處理程序。 當您選擇此命令時,偵錯工具會立即嘗試附加到您之前附加過的最後一個或多個進程,首先比對先前的進程識別碼,若失敗,則比對先前的進程名稱。 如果找不到相符項目,或數個處理程序具有相同的名稱,則會開啟 [附加至處理程序] 對話方塊,以便選取正確的處理程序。
備註
從 Visual Studio 2017 開始,可使用 [ 重新附加至進程 ] 命令。
常見的偵錯案例
為了協助您判斷是否要使用 「附加至進程」 ,以及要附加至哪個進程,下表顯示一些常見的偵錯案例,並提供更多指示的連結(如果有的話)。 (該列表並不詳盡。
若要快速選取要附加的執行中程序,請在 Visual Studio 中輸入 Ctrl+Alt+P,然後輸入程序名稱的第一個字母。
若要讓偵錯工具附加至以 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 套件。
| Scenario | 偵錯方法 | 程序名稱 | 註釋和鏈接 |
|---|---|---|---|
| ASP.NET Core - 網際網路資訊服務 (IIS) 伺服器上的遠端偵錯 | 使用遠端工具和 附加至程序 | w3wp.exe 或 dotnet.exe | 從 .NET Core 3 開始, w3wp.exe 程式會用於預設 的應用程式內裝載模型。 如需應用程式部署,請參閱 發佈至 IIS。 如需詳細資訊,請參閱 遠端 IIS 電腦上的遠端偵錯 ASP.NET Core |
| ASP.NET Core - 啟動應用程式後,在本機電腦上進行偵錯,而不需要偵錯工具 | 使用 附加至進程 | appname.exe 或 iisexpress.exe | 這可能有助於讓您的應用程式載入更快,例如在性能分析時。 ASP.NET Core 的預設本機伺服器 (kestrel) 處理程序是 appname.exe。 |
| ASP.NET 4 或 4.5 - IIS 伺服器上的遠端偵錯 | 使用遠端工具和 附加至程序 | w3wp.exe | 請參閱在遠端 IIS 電腦上進行的 ASP.NET 遠端偵錯 |
| 用戶端腳本 - 在本機 IIS 伺服器上偵錯,以取得支援的應用程式類型 | 使用 附加至程序 | chrome.exe 或 msedge.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.exe、 msedge.exe或其他進程 | 如有必要,請使用資源監視器來協助識別程序。 請參閱 遠端偵錯。 |
| 通用 Windows 平台 (UWP) 應用程式、OneCore、HoloLens 或 IoT 應用程式 - 遠端偵錯 | 偵錯已安裝的應用程式套件 | N/A | 請參閱 偵錯已安裝的應用程式套件,而不是使用 Attach to Process |
| UWP 應用程式、OneCore、HoloLens 或 IoT - 偵錯您未從 Visual Studio 啟動的應用程式 | 偵錯已安裝的應用程式套件 | N/A | 請參閱 偵錯已安裝的應用程式套件,而非使用 [附加至程序] |
使用偵錯工具功能
若要在附加至程序時使用 Visual Studio 偵錯工具的完整功能(例如設定中斷點),應用程式必須與您的本機來源和符號完全一致。 也就是說,偵錯工具必須能夠載入正確的 符號 (.pdb) 檔案。 根據預設,這需要偵錯組建。
針對遠端偵錯案例,您必須已在 Visual Studio 中開啟原始程式碼 (或原始程式碼的複本)。 遠端電腦上已編譯的應用程式二進位檔必須來自與本機電腦相同的組建。
在某些本機偵錯案例中,如果應用程式有正確的符號檔案,您可以在 Visual Studio 中進行偵錯,而無法存取來源。 根據預設,這需要偵錯組建。 如需詳細資訊,請參閱 指定符號和來源檔案。
故障排除連結錯誤
在某些情況下,偵錯工具可能需要協助,才能正確識別要偵錯的程式碼類型。 如果連線值已正確設定 (您可以在 [ 可用的進程 ] 清單中檢視正確的進程,但偵錯工具無法附加,請嘗試在 [ 程式碼類型 ] 清單中選取最適當的偵錯工具,例如,如果您正在偵錯 Linux 或 Python 應用程式,則可能需要這。
在某些情況下,偵錯工具可能需要協助,才能正確識別要偵錯的程式碼類型。 如果連線值已正確設定 (您可以在 [ 可用的進程 ] 清單中檢視正確的進程,但偵錯工具無法附加,請嘗試在 [連線類型] 清單中選取最適當的連線類型,例如,如果您正在偵錯 Linux 或 Python 應用程式,則可能需要這。 如果您使用預設連線類型,則也可以選取要連線的特定程式碼類型,如本節稍後所述。
當偵錯工具附加至執行中的進程時,進程可以包含一或多種類型的程式碼。 偵錯工具可以附加的程式碼類型會在 [ 選取程式碼類型 ] 對話方塊中顯示並選取。
有時候,偵錯工具可以成功附加至一種程式碼類型,但無法附加至另一種程式碼類型。 通常,這種情況發生在以下情況:
- 您嘗試連結至遠端電腦上執行的進程。 遠端電腦可能已針對某些程式代碼類型安裝遠端偵錯元件,但未針對其他程式代碼類型安裝遠端偵錯元件。
- 您嘗試連接到兩個以上的處理程序,以直接偵錯資料庫。 SQL 偵錯功能僅支援附加到單一處理程序。
如果偵錯工具能夠附加至部分 (但不是全部) 程式碼類型,您會看到一則訊息,指出哪些類型無法附加。
如果偵錯工具成功附加至至少一種程式碼類型,您可以繼續偵錯程式。 您將只能偵錯成功附加的程式碼類型。 進程中未附加的程式碼仍會執行,但您將無法設定中斷點、檢視資料,或對該程式碼執行其他偵錯作業。
如果您想了解為何偵錯工具無法附加至某程式碼類型的更具體資訊,請嘗試僅重新附加至該程式碼類型。
取得無法附加程式碼類型原因的特定資訊
從程序中脫身。 在 [偵錯] 功能表上,選取 [全部分離]。
重新附加至程序,只選取無法附加的程式碼類型。
在「 附加至程序 」對話方塊中,選取 「可用程序 」清單中的程序。
在 [ 代碼類型 ] 選項中,選取無法附加的代碼類型。 取消選取其他程式碼類型。
在「附加至程序」對話方塊中,選取「附加」。
這一次,連接將完全失敗,並且您將收到特定的錯誤消息。
脫離程序。 在 [偵錯] 功能表上,選取 [全部分離]。
重新附加至程序,只選取無法附加的程式碼類型。
在「 附加至程序 」對話方塊中,選取 「可用程序 」清單中的程序。
選取 選取。
在 [ 選取程式碼類型 ] 對話方塊中,選取 [偵錯這些程式碼類型 和無法附加的程式碼類型]。 取消選取其他程式碼類型。
請選擇 [確定]。
在「附加至程序」對話方塊中,選取「附加」。
這一次,連接將完全失敗,並且您將收到特定的錯誤消息。