台式电脑

电脑花样机过滤器怎么样调好(一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试)

一:背景1.讲故事

每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇:

我去,本地环境代码跑的哧溜,上了测试环境出问题我去,第三方提供的dll跑出bug了二:两个大坑的解决方案1.本地环境没问题,上了测试出问题

相信很多朋友都有我这样类似的遭遇,明明程序代码,配置文件都一样,挪了一个窝就出问题,你说气人不,既然问题出了那怎么快速解决呢?对,就是用调试,但程序部署在centos上,送一个visualstudio上去也不现实,在这种限制级条件下还想调试怎么办呢?不错,可以上远程调试,然后就很快查到了测试机器中的某一个环境变量搞错了,事情的来龙去脉搞清楚了,接下来就看看怎么实现local到centos的远程调试。

1)测试代码

为了方便演示,我就在Action中读取strategy环境变量。

publicclassHomeController:Controller{publicIActionResultIndex(){ViewBag.strategy=Environment.GetEnvironmentVariable("strategy");returnView();}}2)安装SSH

要远程调试,需要在远端机安装SSH,因为后面附加进程调试就要借助SSH打通。

yuminstallopenssh-serverunzipcurl

安装完成后,就能看到22端口已启动

[root@localhostdata]#netstat-tlnpActiveInternetconnections(onlyservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programnametcp000.0.0.0:220.0.0.0:*LISTEN1126/sshdtcp00127.0.0.1:6310.0.0.0:*LISTEN3037/cupsdtcp00127.0.0.1:250.0.0.0:*LISTEN1739/mastertcp600:::22:::*LISTEN1126/sshdtcp600::1:631:::*LISTEN3037/cupsdtcp600::1:25:::*LISTEN1739/master3)程序的发布配置

发布配置上,第一个要确保是debug版本,第二个要确保是可移植模式(Portable),如下图:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

4)使用附加进程调试

在菜单栏依次选择:Debug->AttachToProcess,然后填写ssh需要的各种信息,如下图:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

点击Connect后,就能看到远端机器的dotnet程序进程号,选择该进程进行附加,在SelectCodeType中选择Nanaged(.NETCoreforUnix)即可,如下图:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

5)顺利调试

在浏览器中键入:http://192.168.142.130/Home/Index,可以看到我的C#代码被命中,也顺利的拿到了远端机器的环境变量,问题也就迎刃而解。

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

2.第三方dll出bug了

调试程序除了使用F9进行调试,相信也有不少朋友知道断点是可以编辑的,比如说:设置表达式断点,过滤器断点,命中次数断点,动作断点,下如图:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

第一个问题就来了,这些花式断点,你真的会用吗?真的会经常用吗?

让我来回答的话,不到万不得已我是不会用的,我更愿意在代码中加入利于调试的测试语句,原因有三点:

更加灵活

电脑花样机过滤器怎么样调好(一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试)

这个显而易见,在面板中设置条件相比用纯语句设置要麻烦得多,点来点去,而且还要条件叠加,复杂的很,我是不喜欢。

功能强大

编辑面板上只有简单的并且关系,而且各个条件还是同级别的,无法做到各个条件的或者关系以及层级或者递归的包含关系,所以。。。没办法。。。

更易于保存

这个就有意思了,在断点上右键是弹出编辑面板,点击左键是关闭断点,问题就出在这里,经常由于手贱,本想点右键结果点了左键。。。。好不容易设置好的条件没了。。。真的没了,从此以后,路转黑。如下图:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

那这么说断点编辑真的没用吗?我觉得只有在不能修改语句的调试场景下能够大显身手,比如我遇到的调试厂家封装的dll,哈哈,既然说到了断点,我就用dnspy演示几个断点给大家复习一下吧!

1)测试代码

为方便演示,用for循环案例是最好的。

publicstaticvoidMain(string[]args){varsum=0;for(inti=0;i< 10000; i++) { sum += i; } Console.WriteLine($"sum={sum}"); }2) 我希望在 sum = 1035 的时候命中断点

这个用条件表达式断点就可以了,非常简单,如下所示:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

3)找到所有能够被1800整除的数,并且记录下当时的i和sum值

这里就可以用到Action断点的日志记录,在for循环迭代中,不需要中断断点,只需记录某一个特定状态下当前的i和sum的值,对调试代码非常有帮助,如下图:

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

三:总结

总的来说这两个经验也算我一步一步踩坑过来的,如果能帮到你就更好了,本篇就聊这么多,下篇再见!

更多高质量干货:参见我的GitHub:dotnetfly

相关新闻

返回顶部