我正在尝试逐步完成对我在 Linux 计算机上构建和运行的 C# .net 项目的调试支持。由于 Visual Studio 本身不能在 Linux 上运行,因此我将其安装在 Windows 虚拟机上,并尝试通过 SSH 隧道使用远程调试来附加到主机操作系统上的 Linux 进程。
我觉得我很接近。我可以成功连接并附加到该进程,但是当我尝试在代码中放置断点时,我收到一条警告,指出该模块尚未加载。我按照故障排除指南进行操作,并在“调试”->“Windows”->“模块”屏幕上验证我的应用程序模块不存在。
为了进行故障排除,我使用 VS code 在 Linux 计算机上创建了一个简单的默认控制台应用程序。这些是文件:
测试应用程序.sln
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{5021DE1D-9E17-4375-B5CA-0556BB75AA08}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5021DE1D-9E17-4375-B5CA-0556BB75AA08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5021DE1D-9E17-4375-B5CA-0556BB75AA08}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5021DE1D-9E17-4375-B5CA-0556BB75AA08}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5021DE1D-9E17-4375-B5CA-0556BB75AA08}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
TestApp/TestApp.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
测试应用程序/程序.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Console.ReadKey();
int x = 52;
int y = 3;
int result = x * y;
Console.WriteLine($"calculation {result}");
我尝试以各种方式运行该应用程序,但结果始终相同。出于演示目的,我将使用 this 指南中的方法并在 VS Code 终端中使用
dotnet TestApp/bin/Debug/net6.0/TestApp.dll
运行。我得到了预期的输出 Hello, World!
,后面是程序等待输入的换行符。
我切换到运行 Windows 和 Visual Studio 的虚拟机,并从共享文件夹加载相同的项目。我使用 SSH 连接类型将调试器附加到主机操作系统,并以名称“dotnet”和标题“dotnet TestApp/bin/Debug/net6.0/TestApp.dll”为目标进程。值得注意的是,还有很多其他 dotnet 进程,但只有这个似乎包含 TestApp 一词。
我在 Visual Studio 中的
Console.ReadKey();
行之后设置了一个断点,并收到一条警告,告诉我不会命中断点,因为模块尚未加载。我检查加载的模块并看到一堆 c 库,但 TestApp.dll 不在那里。
当我在 Linux 上的 VS Code 终端中按 Enter 键时,它会打印计算结果并退出,而不会触发 Visual Studio 中的断点。
我使用 WSL 从安装在 Windows 计算机上的 Visual Studio 在 Ubuntu 上进行调试。 自从我第一次这样做以来已经过去了几个月,但它却出乎意料地简单。据我记得,我从 VS 选择了 WSL 的下拉列表,显示在here。之后,它提示我要安装什么,我只是按照提示操作(使用最新的 Visual Studio 2022)。