每次项目预交付的时候,总会遇到各类奇葩的坑,我以为有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊本身的所闻所遇:git
相信不少朋友都有我这样相似的遭遇,明明程序代码,配置文件都同样,挪了一个窝就出问题,你说气人不,既然问题出了那怎么快速解决呢? 对,就是用调试,但程序部署在 centos 上,送一个 visualstudio 上去也不现实,在这种限制级条件下还想调试怎么办呢?不错,能够上远程调试,而后就很快查到了测试机器中的某一个环境变量搞错了,事情的前因后果搞清楚了,接下来就看看怎么实现 local 到 centos 的 远程调试。github
为了方便演示,我就在 Action 中读取 strategy 环境变量。centos
public class HomeController : Controller { public IActionResult Index() { ViewBag.strategy = Environment.GetEnvironmentVariable("strategy"); return View(); } }
要远程调试,须要在远端机安装 SSH,由于后面附加进程调试 就要借助 SSH 打通。浏览器
yum install openssh-server unzip curl
安装完成后,就能看到 22 端口已启动bash
[root@localhost data]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1126/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3037/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1739/master tcp6 0 0 :::22 :::* LISTEN 1126/sshd tcp6 0 0 ::1:631 :::* LISTEN 3037/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1739/master
发布配置上,第一个要确保是 debug 版本,第二个要确保是 可移植模式 (Portable), 以下图:ssh
在菜单栏依次选择:Debug -> Attach To Process,而后填写 ssh 须要的各类信息,以下图:curl
点击 Connect 后,就能看到远端机器的 dotnet程序 进程号,选择该进程进行附加,在 Select Code Type 中选择 Nanaged (.NET Core for Unix)
便可,以下图:tcp
在 浏览器中键入: http://192.168.142.130/Home/Index
,能够看到个人 C# 代码被命中,也顺利的拿到了远端机器的 环境变量,问题也就迎刃而解。测试
调试程序除了使用 F9 进行调试,相信也有很多朋友知道断点是能够编辑的,好比说:设置表达式断点,过滤器断点,命中次数断点,动做断点,下如图:url
第一个问题就来了,这些花式断点,你真的会用吗?真的会常常用吗?
让我来回答的话,不到万不得已我是不会用的,我更愿意在代码中加入利于调试的测试语句,缘由有三点:
这个显而易见,在面板中设置条件相比用纯语句设置要麻烦得多,点来点去,并且还要条件叠加,复杂的很,我是不喜欢。
编辑面板上只有简单的而且关系,并且各个条件仍是同级别的,没法作到各个条件的或者关系以及层级或者递归的包含关系,因此。。。没办法。。。
这个就有意思了,在断点上右键是弹出编辑面板,点击左键是关闭断点,问题就出在这里,常常因为手贱,本想点右键结果点了左键 😨😨😨。。。。 好不容易设置好的条件没了。。。真的没了😭😭😭,今后之后,路转黑。以下图:
那这么说断点编辑真的没用吗? 我以为只有在不能修改语句的调试场景下可以大显身手,好比我遇到的调试厂家封装的dll,哈哈,既然说到了断点,我就用 dnspy 演示几个断点给你们复习一下吧!
为方便演示,用 for 循环案例是最好的。
public static void Main(string[] args) { var sum = 0; for (int i = 0; i < 10000; i++) { sum += i; } Console.WriteLine($"sum={sum}"); }
这个用条件表达式断点就能够了,很是简单,以下所示:
这里就能够用到 Action 断点的日志记录,在 for 循环迭代中,不须要中断断点,只需记录某一个特定状态下当前的 i 和 sum 的值,对调试代码很是有帮助,以下图:
总的来讲这两个经验也算我一步一步踩坑过来的,若是能帮到你就更好了,本篇就聊这么多,下篇再见!
更多高质量干货:参见个人 GitHub: dotnetfly