新聞中心
首先要承認(rèn)這個(gè)標(biāo)題有那么一丁點(diǎn)標(biāo)題黨,但這又不是完全的標(biāo)題黨。使用“正確”的調(diào)試方法的確可以把 VS 給搞死鎖了。至于 VS 被死鎖了算不算 Bug,這個(gè)問(wèn)題有待于商榷。不想吐槽,先看看怎么用“正確”的方法把 VS 搞死鎖。

玉屏ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
首先要新建一個(gè)控制臺(tái)項(xiàng)目,完整的復(fù)制下列代碼:
- 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;
- }
- }
- }
然后在正確的位置插上正確的斷點(diǎn):
然后在即時(shí)窗口里面輸入:Get()
現(xiàn)在你的 VS 有99.99%的概率會(huì)到達(dá)一種“死鎖”狀態(tài)(如果沒(méi)有被死鎖,恭喜你,你現(xiàn)在就可以去買(mǎi)雙色球,記得中獎(jiǎng)了分大家一點(diǎn))。IDE 在等待寄主進(jìn)程返回結(jié)果,而寄主進(jìn)程又需要等待其中的某一個(gè)線(xiàn)程釋放鎖,又因?yàn)樘幵谡{(diào)試狀態(tài),寄主進(jìn)程沒(méi)辦法繼續(xù)執(zhí)行下一步代碼,也就無(wú)法釋放鎖,最終導(dǎo)致了一個(gè)死鎖的存在。雖然是死鎖,但是 VS 的 UI 并沒(méi)有被鎖死,所以我們現(xiàn)在***能做的事情就是結(jié)束調(diào)試。
現(xiàn)在實(shí)驗(yàn)結(jié)束,大家來(lái)討論下這算不算是 VS 的一個(gè) Bug?
正方觀點(diǎn):
會(huì)影響正常調(diào)試,當(dāng)然算 Bug
只要導(dǎo)致程序非正常終止的都算 Bug
反方觀點(diǎn):
是你自己調(diào)試方法不正確,不能怪 VS
BUG本身是錯(cuò)誤,是不按正常的理解執(zhí)行,不是說(shuō)死鎖就是有BUG
怎么才能解決這一“Bug”?
從程序員自身角度考慮,只有增加自身編碼能力和調(diào)試能力
從 VS 健壯角度考慮,可以使用沙箱模式,并檢測(cè)到在執(zhí)行一定時(shí)間還未得出結(jié)果后,主動(dòng)退出。
再看看維基百科是怎么定義 Bug 的:程序錯(cuò)誤(英語(yǔ):Bug),在程序設(shè)計(jì)中的術(shù)語(yǔ),是指在軟件運(yùn)行中因?yàn)槌绦虮旧碛绣e(cuò)誤而造成的功能不正常、死機(jī)、數(shù)據(jù)丟失、非正常中斷等現(xiàn)象。http://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF
關(guān)于類(lèi)似問(wèn)題的探討,還有另外一篇博文《一個(gè)WPF和SL的嚴(yán)重BUG,能導(dǎo)致任何的寄主程序崩潰》。
當(dāng)前文章:VisualStudio出現(xiàn)死鎖是BUG?
URL分享:http://www.5511xx.com/article/dpigepd.html


咨詢(xún)
建站咨詢(xún)
