从 Visual Studio 2017 开始,可通过 SSH 附加到在 Linux 上运行的 .NET Core 进程。 本文介绍调试的设置方法和调试方法。
先决条件
在 Visual Studio 计算机上,需要安装“ASP.NET 和 Web 开发”工作负载或“.NET Core 跨平台开发”工作负载 。
在 Linux 服务器上,需要安装 SSH 服务器,可使用 curl 或 wget 解压缩并安装。 例如,在 Ubuntu 上,可以通过运行以下内容来实现此目的:
sudo apt-get install openssh-server unzip curl
生成并部署应用程序
准备应用程序以进行调试:
-
生成应用程序时,请考虑使用“调试”配置。 调试零售编译代码(发布配置)比调试编译代码要困难得多。 如果需要使用“发布”配置,请先禁用“仅我的代码”。 若要禁用此设置,请选择“工具” > “选项” > “调试”,然后选择“启用仅我的代码” 。
-
请确保项目配置为生成可移植 PDB(默认设置),并确保 PDB 与 DLL 处于同一位置。 若要在 Visual Studio 中配置此项目,请右键单击它,然后选择“属性” > “生成” > “高级” > “调试信息” 。
在调试之前,可以使用多种方法来部署应用。 例如,你可以:
-
将源复制到目标计算机,并在 Linux 计算机上使用
dotnet build
进行生成。 -
在 Windows 上生成应用,并将生成项目传输到 Linux 计算机。 (生成工件包含应用程序本身、它可能依赖的任何运行时库和 .deps.json 文件。)
附加调试器
配置计算机后,在 Linux 计算机上启动应用程序,然后准备好附加调试器。
-
在 Visual Studio 中,选择“调试” > “附加到进程…” 。
-
在“连接类型”列表中,选择“SSH” 。
-
将“连接目标”更改为目标计算机的 IP 地址或主机名。
-
查找要调试的进程。
代码以唯一的进程名或名为 dotnet 的进程运行。 若要查找你感兴趣的进程,请查看“Title”列,该列显示了进程的命令行参数。
在下面的示例中,你将在“附加到进程”对话框中显示的 SSH 传输上看到远程 Linux 计算机中的进程列表。
-
选择 “附加” 。
-
在显示的对话框中,选择要调试的代码类型。 选择“托管(.NET Core for Unix)”。
-
使用 Visual Studio 调试功能来调试应用。
在下面的示例中,你将看到 Visual Studio 调试器在远程 Linux 计算机上运行的代码断点停止。
如果linux不能上网的话,在vs的控制台会报错,从中可以找到一些有用的信息
未能启动调试适配器“coreclr”。 Execution of command '/bin/sh "/root/.vs-debugger/GetVsDbg.sh" -v vs2019 -l "/root/.vs-debugger/vs2019" -a "/remote_debugger"' on remote system failed with return code: 1 初始化日志: Determining user folder on remote system... Checking for existing installation of debugging tools... Downloading debugger launcher... Creating debugger installation folder: /root/.vs-debugger Copying debugger launcher to /root/.vs-debugger/GetVsDbg.sh Ensuring script exists after copying... Downloading debugger components... Output: Info: Previous installation at '/root/.vs-debugger/vs2019' not found Info: Using vsdbg version '16.8.11013.1' Info: Creating install directory Using arguments Version : 'vs2019' Location : '/root/.vs-debugger/vs2019' SkipDownloads : 'false' LaunchVsDbgAfter : 'false' RemoveExistingOnUpgrade : 'false' Info: Using Runtime ID 'linux-x64' Downloading https://vsdebugger.azureedge.net/vsdbg-16-8-11013-1/vsdbg-linux-x64.tar.gz ERROR: Could not download https://vsdebugger.azureedge.net/vsdbg-16-8-11013-1/vsdbg-linux-x64.tar.gz Failed: Execution of command '/bin/sh "/root/.vs-debugger/GetVsDbg.sh" -v vs2019 -l "/root/.vs-debugger/vs2019" -a "/remote_debugger"' on remote system failed with return code: 1 程序“[17167] dotnet”已退出,返回值为 -1 (0xffffffff)。
从上面的报错信息可以看出,linux会从这个地址下载调试工具:https://vsdebugger.azureedge.net/vsdbg-16-8-11013-1/vsdbg-linux-x64.tar.gz
找了一台能联网的linux主机,尝试上面的远程调试,会发现/root/.vs-debugger/vs2019目录下面下载一个名“vsdbg-linux-x64.tar”的文件,因为是从国外的地址下载的,速度会奇慢,漫长的等待之后,下载完成自动解压到当前目录,然后再用vs启动远程调试,第一次报错,再试,一切顺利,能正常进断点。
对比安装完后的/root/.vs-debugger/vs2019文件夹,和手动下载的vsdbg-linux-x64.tar.gz,就多了一个success.txt文件,应该是通过这个来标识远程调试工具已经安装完成,为了验证猜想,我把手动下载的vsdbg-linux-x64.tar.gz包复制到不能联网的linux主机上,手动新建了一个success.txt文件,然后远程调试,发现可以跳过重复下载的问题,但附加调试报错,暂时未能解决。
以下为success.txt的内容
16.8.11013.1