把 Visual Studio 死锁了,Bug?
首先要承认这个标题有那么一丁点标题党,但这又不是完全的标题党。使用“正确”的调试方法的确可以把 VS 给搞死锁了。至于 VS 被死锁了算不算 Bug,这个问题有待于商榷。不想吐槽,先看看怎么用“正确”的方法把 VS 搞死锁。
首先要新建一个控制台项目,完整的复制下列代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | using System.Threading; namespace DeadlockVS { class Program { static object _obj = new object (); static void Main( string [] args) { Thread.CurrentThread.Name = "Main Thread" ; ThreadStart ts = () => { while ( true ) { lock (_obj) Thread.Sleep(100); Thread.Sleep(1); } }; for ( int i = 0; i < 2; i++) new Thread(ts).Start(); Thread.Sleep(1000); ts(); } static int Get() { lock (_obj) return 1; } } } |
然后在正确的位置插上正确的断点:
然后在即时窗口里面输入:Get()
现在你的 VS 有99.99%的概率会到达一种“死锁”状态(如果没有被死锁,恭喜你,你现在就可以去买双色球,记得中奖了分大家一点)。IDE 在等待寄主进程返回结果,而寄主进程又需要等待其中的某一个线程释放锁,又因为处在调试状态,寄主进程没办法继续执行下一步代码,也就无法释放锁,最终导致了一个死锁的存在。虽然是死锁,但是 VS 的 UI 并没有被锁死,所以我们现在唯一能做的事情就是结束调试。
现在实验结束,大家来讨论下这算不算是 VS 的一个 Bug?
正方观点:
- 会影响正常调试,当然算 Bug
- 只要导致程序非正常终止的都算 Bug
反方观点:
- 是你自己调试方法不正确,不能怪 VS
- BUG本身是错误,是不按正常的理解执行,不是说死锁就是有BUG
怎么才能解决这一“Bug”?
- 从程序员自身角度考虑,只有增加自身编码能力和调试能力
- 从 VS 健壮角度考虑,可以使用沙箱模式,并检测到在执行一定时间还未得出结果后,主动退出。
再看看维基百科是怎么定义 Bug 的:程序错误(英语:Bug),在程序设计中的术语,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。http://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF
关于类似问题的探讨,还有另外一篇博文《一个WPF和SL的严重BUG,能导致任何的寄主程序崩溃》。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异