分享方式:


透過連結至流程來使用 SSH 在 Linux 上對 .NET Core 進行偵錯

從 Visual Studio 2017 開始,您可以透過安全殼層 (SSH) 連結至本機或遠端 Linux 部署上執行的 .NET Core 和 .NET 5+ 流程。 本文會說明如何設定偵錯,以及如何偵錯。 如需使用 Docker 容器偵錯案例,請參閱 連結至 Docker 容器上執行的流程,以及 容器工具 文章。 若要從 Visual Studio 對 WSL 2 上的 Linux 進行偵錯 (沒有連結至流程),請參閱 使用 Visual Studio 對 WSL 2 中的 .NET Core 應用程式進行偵錯

注意

若要對在 Azure Kubernetes Service (AKS) 上執行的 Linux 進行偵錯,與其連結至流程,會建議 橋接至 Kubernetes

必要條件

  • 在 Linux 伺服器上,您必須安裝 SSH 伺服器、使用 curl 或 wget 解壓縮並安裝。 例如,您可以在 Ubuntu 上執行下列動作來完成這個動作:

    sudo apt-get install openssh-server unzip curl
    

    除了 SSH,也必須啟用 SFTP。 大部分的 SSH 發行版本預設會安裝並啟用 SFTP,但情況不一定如此。

  • 在 Linux 伺服器上,在 Linux 上安裝 .NET 執行階段,並尋找符合 Linux 發行版本的頁面 (例如 Ubuntu)。 不需要 .NET SDK。

  • 如需完整的 ASP.NET 核心指示,請參閱 在 Linux 上使用 Nginx 裝載 ASP.NET Core在 Linux 上使用 Apache 裝載 ASP.NET Core

備妥您的應用程式以進行偵錯

若要準備您的應用程式以進行偵錯:

  • 當您建置應用程式時,請考慮使用偵錯設定。 偵錯零售編譯程式碼 (一種發行版本設定) 比偵錯編譯程式碼更難。 如果您需要使用發行版本設定,請先停用 Just My Code。 若要停用此設定,請選擇 [工具]>[選項]>[偵錯],然後取消選取 [啟用 Just My Code]
  • 請確定您的專案已設定為產生 可攜式 PDB (這是預設設定),並確定 PDB 位於與 DLL 相同的位置。 若要在 Visual Studio 中設定此設定,請以滑鼠右鍵按一下專案,然後選擇 [屬性]>[一般]>[偵錯符號]
  • 請確定您的專案已設定為產生 可攜式 PDB (這是預設設定),並確定 PDB 位於與 DLL 相同的位置。 若要在 Visual Studio 中設定此設定,請以滑鼠右鍵按一下專案,然後選擇 [屬性]>[建置]>[進階]>[偵錯資訊]

組建和部署應用程式

在偵錯之前,您可以使用數種方法來部署應用程式。 例如,您可以:

  • 將來源複製到目標電腦,並使用 Linux 電腦上的 dotnet build 進行組建。

  • 在 Windows 上建置應用程式,然後將組建成品傳輸到 Linux 電腦。 (組建成品是由應用程式本身、可攜式 PDB、它可能依賴的任何執行階段程式庫,以及 .deps.json 檔案所組成。)

部署應用程式時,請啟動應用程式。

附加偵錯工具

當應用程式在 Linux 電腦上執行時,您就可以連結偵錯工具。

  1. 在 Visual Studio 中,選擇 [偵錯]>[連結至流程...]

  2. [連線類型] 清單中,選取 [SSH]

  3. [連線目標] 變更為目標電腦的 IP 位址或主機名稱。

    如果您尚未提供認證,系統會提示您輸入密碼和/或私密金鑰檔案。 如需使用私密金鑰檔案的詳細資訊,請參閱設定遠端連線

    除了 SSH 伺服器正在執行的連接埠之外,沒有需要設定的連接埠要求。

  4. 尋找您想要偵錯的流程。

    您的程式碼會以唯一的流程名稱或名為 dotnet 的流程執行。 若要尋找您感興趣的流程,請檢查 [標題] 資料行,當中會顯示流程的命令列引數。

    在下列範例中,您會透過 [連結至流程] 對話方塊中顯示的 SSH 傳輸,看到來自遠端 Linux 電腦的流程清單。

    「附加到 Linux 程序」的螢幕擷取畫面。

    「附加到 Linux 程序」的螢幕擷取畫面。

  5. 選擇 [ 附加]。

    在出現的對話方塊中,選取您要偵錯的程式碼類型。 選擇 [受控 (Unix 的 .NET Core)]

  6. 使用 Visual Studio 偵錯功能來偵錯應用程式。

    在下列範例中,您會看到 Visual Studio 偵錯工具在遠端 Linux 電腦上執行之程式碼中的中斷點停止。

    抵達中斷點的螢幕擷取畫面。

    抵達中斷點的螢幕擷取畫面。