如何用VS来远程调试Linux上的.net core程序

为什么有这个需求

最近我写了一下。net Core的引用,并且泡在Linux上。工作流程一般是在我的windows开发机上用伟大的Visual Studio来开发和调试。然后Publish到Linux目标机上。在Windows上一般我都会调好,能够运行没啥Bug在部署。但是经常在Windows上好好的,到了windows上就不行。经过我多年的经验,我总结出伟大的定理:Windows上能用到了Linux下不能用不是权限问题就是大小写问题(90%情况下)。但是为了更好的找到问题,或者是那10%的疑难杂症,我们需要调试。有没有什么办法可以让调试目标机上的代码和本地调试一样方便呢?有的,就是用VS的远程调试。

前提

我假设你已经有了VS2017,被调试程序使用.net Core写的,目标Linux上一斤有dotnet core的runtime,能够运行你写的程序。

首先你要有那个服务器SSH的权限,root的

首先你要可以一root ssh到那个服务器上,因为后面你需要装个软件

然后你需要安装VSDBG

这是一个调试器,需要装在远程Linux目标机上,运行下面两个指令中任意一个

# 用cURL
curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v vs2017u5 -l ~/vsdbg
# 或者, wget
wget https://aka.ms/getvsdbgsh -O - 2>/dev/null | /bin/sh /dev/stdin -v vs2017u5 -l ~/vsdbg

然后请确保使用调试编译你的项目

用调试编译才能正确地加载符号文件,才能正确的调试,即使你发布也要选择调试编译,如下图

然后你就可以attach到远程线程上了

点击调试->附加到线程

然后,连接类型是ssh,连接目标点一下他会弹出窗口,你输入服务器登陆的信息就行。
然后他就会连接上服务器,在下面的框中显示当前登录用户的线程,如果线城市别的用户启动的,一般都是,比如我一般喜欢为一个服务创建独立的用户,你就勾选上显示所有用户进程。然后在那个搜索框里输入dotnet就能过滤出所有dotnet core的进程。你双击你想要附加的线程,选择Managed那个调试器点确定,就可以调试了。和本体调试一毛一样,断点单步啥的随便用。

参考文献:

https://github.com/Microsoft/MIEngine/wiki/Offroad-Debugging-of-.NET-Core-on-Linux---OSX-from-Visual-Studio


本文章使用limfx的vsocde插件快速发布