从 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 上执行远程调试,现在除了 iosandroid 开发之外,它是免费的。我对它进行了扩展,修复了我在运行 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 填写 IPPort 字段。单击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 版本,请使用以下命令将其删除:

    sudo apt-get purge mono-complete

    sudo apt-get 自动删除

    安装 Mono 4.0.2 版:

    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

    启动 MonoRemoteDebugger 服务器:

    单声道MonoRemoteDebugger.Server/MonoRemoteDebugger.Server.exe

    在 Visual Studio 中设置断点并在 Visual Studio 中选择菜单项MonoRemoteDebugger -&gt; 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++ 项目

将 C# Stateful Service Fabric 应用程序从 Visual Studio 部署到 Linux