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;
- }
- }
- }
然后在正確的位置插上正確的斷點:
然后在即時窗口里面輸入:Get()
現在你的 VS 有99.99%的概率會到達一種“死鎖”狀態(tài)(如果沒有被死鎖,恭喜你,你現在就可以去買雙色球,記得中獎了分大家一點)。IDE 在等待寄主進程返回結果,而寄主進程又需要等待其中的某一個線程釋放鎖,又因為處在調試狀態(tài),寄主進程沒辦法繼續(xù)執(zhí)行下一步代碼,也就無法釋放鎖,最終導致了一個死鎖的存在。雖然是死鎖,但是 VS 的 UI 并沒有被鎖死,所以我們現在***能做的事情就是結束調試。
現在實驗結束,大家來討論下這算不算是 VS 的一個 Bug?
正方觀點:
會影響正常調試,當然算 Bug
只要導致程序非正常終止的都算 Bug
反方觀點:
是你自己調試方法不正確,不能怪 VS
BUG本身是錯誤,是不按正常的理解執(zhí)行,不是說死鎖就是有BUG
怎么才能解決這一“Bug”?
從程序員自身角度考慮,只有增加自身編碼能力和調試能力
從 VS 健壯角度考慮,可以使用沙箱模式,并檢測到在執(zhí)行一定時間還未得出結果后,主動退出。
再看看維基百科是怎么定義 Bug 的:程序錯誤(英語:Bug),在程序設計中的術語,是指在軟件運行中因為程序本身有錯誤而造成的功能不正常、死機、數據丟失、非正常中斷等現象。http://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF
關于類似問題的探討,還有另外一篇博文《一個WPF和SL的嚴重BUG,能導致任何的寄主程序崩潰》。
原文鏈接:http://www.cnblogs.com/Aimeast/archive/2011/09/26/2192328.html
【編輯推薦】