• 把 Visual Studio 死锁了,Bug?


        首先要承认这个标题有那么一丁点标题党,但这又不是完全的标题党。使用“正确”的调试方法的确可以把 VS 给搞死锁了。至于 VS 被死锁了算不算 Bug,这个问题有待于商榷。不想吐槽,先看看怎么用“正确”的方法把 VS 搞死锁。

        首先要新建一个控制台项目,完整的复制下列代码:

    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;
            }
        }
    }

        然后在正确的位置插上正确的断点:

    image

        然后在即时窗口里面输入:Get()

    image

        现在你的 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,能导致任何的寄主程序崩溃》。

  • 相关阅读:
    插入排序
    阅读书单 2012 8月至12月
    sed学习1
    sed入门(一直在改变系列2)
    linux find资料(一直在改变系列4)
    awk入门(一直在改变系列1)
    分治算法
    shell脚本知识点1(一直在改变系列3)
    选择排序(selection sort)
    英语单词循环记忆第一期(自学使用)
  • 原文地址:https://www.cnblogs.com/Aimeast/p/2192328.html
Copyright © 2020-2023  润新知