从 Visual Studio 进行 Linux .NET 远程调试
Posted
技术标签:
【中文标题】从 Visual Studio 进行 Linux .NET 远程调试【英文标题】:Linux .NET remote debugging from Visual Studio 【发布时间】:2014-05-31 06:48:41 【问题描述】:我想从 Visual Studio 远程调试在 Linux 上运行的 C# 控制台应用程序。以下是我目前发现的:
http://www.mono-project.com/Debugger
Mono 运行时实现了一个调试接口,允许 调试器和 IDE 来调试托管代码。这被称为软 调试器并受 MonoDevelop、Xamarin Studio 和 Visual Studio(安装适当的插件时)以及 命令行 SDB 客户端。
Mono 提供了一个 API 来与调试器通信并创建您的 通过 Mono.Debugger.Soft.dll 程序集拥有自己的调试 UI。
下面的页面讨论了当前 MonoVS 调试器实现的一些问题,但我觉得它们都很好。
http://mono-project.com/Visual_Studio_Integration
该页面还链接到 MonoVS 入门指南:
http://mono-project.com/GettingStartedWithMonoVS
其中包含 MonoTools 的下载链接:
http://mono-tools.com/download/
但是,下载链接现在重定向到:
http://xamarin.com/download/
我可以在哪里下载 Xamarin Studio Starter Edition。单击定价链接,我发现我至少需要 Visual Studio 支持的商业版,每年 999 美元。嗯,不用了,谢谢。
这就是我卡住的地方。我的环境的一些细节:
开发环境:
Windows 7 64 位 Visual Studio Pro 2013(如果效果更好,可能会使用 2010)目标环境:
树莓派 Raspbian Wheezy 单声道 3.2.8 通过 SSH 运行控制台应用程序【问题讨论】:
MonoVS 是 Novell 出售的商业产品,当时大多数 Mono 人都被聘用(在 Novell 收购 Ximian 之后)。自 Xamarin 推出以来,该产品已不再可用。为了清楚起见,他们应该从 Mono 主页中删除这些页面。无论如何,答案中显示的远程调试器是一种非常有趣的方法。 【参考方案1】:我发现这个 Visual Studio 2015 扩展非常有用:MonoRemoteDebugger for Visual Studio 2015
请参阅 MonoRemoteDebugger v1.0.4 以修复与 Visual Studio 2015 update2 上的 Xamarin Visual Studio 扩展的冲突。
【讨论】:
谢谢,我还没有找到解决方案,所以这看起来很有趣。 @Anlo 希望对您有所帮助!如果遇到麻烦,请随意标记为答案或解雇新答案。 好吧,像魅力一样工作有点牵强。是的,您可以调试,但只能设置断点并单步执行。只能观察像 int 这样的本地原始类型。您无法在调用堆栈中导航,也无法重置当前指令位置。因此,基本上只需逐步执行您的代码 - 但这是一个开始:) 当然有帮助。在 VS 2015 Update 2 上,小心使用 MonoRemoteDebugger v1.0.4 来修复与 Xamarin VS 扩展的冲突。 “如何在 Linux 中的 Mono 下调试 Visual Studio .NET 应用程序”的任何解决方案? ***.com/questions/23721964/…【参考方案2】:我发现this guide 解释了如何使用 Xamarin Studio 在 Windows 上执行远程调试,现在除了 ios 和 android 开发之外,它是免费的。我对它进行了扩展,修复了我在运行 Raspbian Jessie Lite (2017-04-10) 的 Raspberry Pi Zero W 上测试它时遇到的问题。
-
下载并安装Xamarin Studio、GTK# for .NET和.NET Framework 4.6.2。 Xamarin Studio 需要 .NET 4.5,但 GTK# 需要 .NET 4.6。我使用了 Xamarin Studio 版本 6.1.2(内部版本 44)和 GTK# 版本 2.12.44。
我在与我的 VS2015 机器不同的虚拟机上安装了 Xamarin Studio,因此我还需要下载并安装 MSBuild Tools 2013 和 MSBuild Tools 2015。
创建环境变量
MONODEVELOP_SDB_TEST = 1
(我的电脑 -> 属性 -> 高级系统设置 -> 环境变量)。
启动 Xamarin Studio。如果未显示任何窗口,请检查文件夹 %localappdata%\XamarinStudio-6.0\Logs
中的日志文件以查看失败的原因。
我在 Visual Studio 2015 中创建了一个 .NET 4.6 控制台应用程序并添加了 NuGet 包 Mono.Unofficial.pdb2mdb,我使用的是 4.2.3.4 版本。包 Mono.pdb2mdb 版本 0.1.0.20130128 似乎不适用于 VS2015 (PdbDebugException: Unknown custom metadata item kind: 6
) 构建的程序集。
将 .sln 或 .csproj 文件从 Visual Studio 加载到 Xamarin Studio。构建解决方案并使用 NuGet 包文件夹中的 pdb2mdb 工具创建一个 .mdb 文件:pdb2mdb MyProgram.exe
我使用WinSCP 将 MyProgram.exe 和 MyProgram.exe.mdb 复制到我的树莓派。
我使用 SSH 使用 Putty 登录并在 Pi 上安装了 Mono 版本 3.2.8:sudo apt-get install mono-complete
。
使用调试器标志启动 Mono 运行时:mono --debug --debugger-agent=transport=dt_socket,address=0.0.0.0:12345,server=y /path/to/MyProgram.exe
。这将启动程序但在 Xamarin Studio 调试器连接之前暂停执行。
在 Xamarin Studio 中设置断点并选择菜单项Run -> Run with -> Custom Configuration...
并选择Run Action = Debug - Custom Command Mono Soft Debugger
。点击Debug
。
使用 Mono 命令行中指定的 linux 系统的 IP 地址和端口 12345 填写 IP
和 Port
字段。单击Connect
将开始执行,并在断点处停止。
可以设置条件断点、步入/退出/跳过代码、监视原语和对象等,而且速度也很快。我宁愿直接从 Visual Studio 进行调试,但这似乎是一个完全可行的解决方案。
【讨论】:
【参考方案3】:我终于找到了一种对在我的Raspberry Pi 上运行的 C# 代码进行远程调试的好方法。我已从 Mono 切换到 .NET Core,现在可以使用 Visual Studio 调试在 Raspberry Pi 上运行的代码,几乎和在我的开发机器上运行一样简单。
以下步骤已使用 Windows 10 版本 1909、Visual Studio 2019 版本 16.4.3、Raspbian Buster Lite 版本 2020-02-13 和 Raspberry Pi 2 Model B 进行测试。.NET Core 需要 ARMv7 CPU,因此它将不能在 Raspberry Pi 1 和 Zero 上运行。
转到 https://dotnet.microsoft.com/download/dotnet-core 并选择 .NET Core 3.1(或更高版本)。单击 Linux ARM32 运行时二进制文件的链接并复制下一页显示的直接链接。 (不要右键单击 ARM32 链接并选择复制链接地址,因为如果您下载该链接,最终会得到一个网页。)
打开与 Raspberry Pi 的 SSH 会话,下载并安装二进制文件:
ssh pi@192.168.0.xxx
wget https://download.visualstudio.microsoft.com/download/pr/c11e9248-404f-4e5b-bd99-175079419d6f/83902a43e06f9fb4e45a4c6a6d5afc0b/dotnet-runtime-3.1.3-linux-arm.tar.gz
sudo mkdir /opt/dotnet
sudo tar zxf dotnet-runtime-3.1.3-linux-arm.tar.gz -C /opt/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/bin/dotnet
将以下行添加到~/.bashrc
,注销并再次登录以激活:
export DOTNET_ROOT=/opt/dotnet
检查 .NET Core 是否已正确安装:
dotnet --info
在 Visual Studio 中创建一个 *.NET Core 控制台应用```lang-none。设置 Target framework = .NET Core 3.1(或您下载到 Raspberry Pi 的版本)。确保 Project → Properties → Build → Output → Advanced → Debugging information = Portable。
在 Visual Studio 中构建项目并将所有 *.dll、*.pdb、*.deps.json 和 *.runtimeconfig.json 文件从开发机器复制到 Pi。可以使用PuTTY's pscp command:
cd bin\Debug\netcoreapp3.1
pscp -pw <password> *.dll *.pdb *.deps.json *.runtimeconfig.json pi@192.168.0.xxx:/home/pi
打开与 Raspberry Pi 的 SSH 会话并运行程序,或者使用 SSH 从开发机器启动它:
ssh pi@192.168.0.xxx dotnet /home/pi/MyProgram.dll
通过在 Visual Studio 中选择“调试”→“附加到进程”菜单项附加到远程进程。选择 Connection type = SSH 并在 Connection target 文本框中输入 pi@192.168.0.xxx 并按 Enter.
输入密码并点击连接按钮。
单击选择按钮。
选择Managed (.NET Core for Unix)并点击OK按钮。
选择dotnet MyProgram.dll
进程并单击附加 按钮。第一次连接可能需要几分钟,但后续连接要快得多。
享受设置断点、添加监视、单步执行代码甚至使用“设置下一条语句”的乐趣 - 几乎与在本地计算机上调试时一样快。到目前为止,我唯一缺少的是编辑并继续,但还不足以调查是否有可能实现。
【讨论】:
【参考方案4】:您需要的解决方案将于今年与 MonoDebugger.NET 一起推出。开发人员“承诺”我们可以部署到任何 Mono 设备,并在 Visual Studio(2010 到 2015 年)中对其进行调试。
【讨论】:
这么多,我猜?【参考方案5】:在 Gutemberg Ribeiro's answer 的基础上,我设法让 MonoRemoteDebugger 在运行 Raspbian Jessie Lite (2017-04-10) 的 Raspberry Pi Zero W 上使用 VS2015。诀窍是安装高于 3.2.8 的 Mono 版本:
-
安装MonoRemoteDebugger Visual Studio 扩展,我用的是1.2.0版本。
在 Visual Studio 中创建一个 .NET 4.6 控制台应用程序。
如果 Raspberry Pi 上安装了较旧的 Mono 版本,请使用以下命令将其删除:
安装 Mono 4.0.2 版:sudo apt-get purge mono-complete
sudo apt-get 自动删除
安装 MonoRemoteDebugger 服务器:sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://plugwash.raspbian.org/mono4 jessie-mono4 main" | sudo tee -a /etc/apt/sources.list
sudo apt-get 更新
sudo apt-get install mono-complete
启动 MonoRemoteDebugger 服务器:wgethttps://github.com/techl/MonoRemoteDebugger/releases/download/v1.2.0/MonoRemoteDebugger.Server.zip
解压 -d MonoRemoteDebugger.Server MonoRemoteDebugger.Server.zip
在 Visual Studio 中设置断点并在 Visual Studio 中选择菜单项单声道MonoRemoteDebugger.Server/MonoRemoteDebugger.Server.exe
MonoRemoteDebugger -> Debug with Mono (remote)
。
将 Remote-IP 设置为 Raspberry Pi 的 IP 地址,然后单击连接。 MonoRemoteDebugger 将编译程序并将其传输到 Raspberry Pi。无需手动运行 pdb2mdb,.mdb 文件将由 MonoRemoreDebugger 服务器创建。
说实话,调试功能非常有限。简单的断点和步入/退出/越过代码似乎工作得还不错。在函数中设置断点然后单步执行该函数调用不会在断点处停止。
可以观看原始类型,但无法显示我尝试观看的对象。调用堆栈视图非常有限,线程视图为空。异常不会被捕获,但会导致来自 MonoRemoteDebuggerServer 的“[ERROR] FATAL UNHANDLED EXCEPTION”消息。但如果你能忍受这些限制,那么设置会比Xamarin Studio route 更简单。
【讨论】:
【参考方案6】:有一个 Xamarin Studio/MonoDevelop 插件
https://github.com/logicethos/SSHDebugger
【讨论】:
以上是关于从 Visual Studio 进行 Linux .NET 远程调试的主要内容,如果未能解决你的问题,请参考以下文章
从linux交叉编译到windows一个visual studio项目
使用 Visual Studio 2017 进行远程调试时,Linux 控制台输出在哪里?
从 Visual Studio 2008 解决方案创建 Unix makefile
从 Linux 动态库/Linux 控制台应用程序导出/导入 C++ 函数 | Visual Studio Linux 项目
无法从 Visual Studio 启动 gdb 以在 Windows 上的 Linux 子系统中远程调试 Linux C++ 项目