答案of QUIZ:一個網頁上面有多少個SilverLight4應用時會發生莫名其妙的崩潰?和什麼有關?

來源:互聯網
上載者:User

答案:It depends.

 

“你去屎吧!”

我猜一定會有人這麼說。既然“

改天我也去發一篇“QUIZ: 園子一個使用者發多少篇給個問題還看心情才給答案的文章才會讓全園友崩潰,是什麼原因”放首頁來好了 ”這樣的回複,上面那個想法也肯定必然的。好,那我先劇透一點:這個崩潰和裡面的那一個字是什麼有關,而且和你是什麼職業也有關。

 

“靠,這怎麼可能,你乾脆說是人品問題好了!”好吧,如果你真這麼想,那我也只好說,至於你信不信,我反正是信了。

其實我發這些個QUIZ的原因,是發現了一些有意思的問題,希望大家去實驗一把。可是現在園子水平真的很不濟,貌似願意動手刨根究底的人並不多。這也是我在工作中發現的一種現象,很多人都“知其然不知其所以然”,並且心安理得。好吧,抱怨到此結束,下面來說說這個很奇妙的崩潰問題。

 

在我們的工作當中,發現了一個很奇怪的崩潰現象:(非常抱歉,沒有任何,描述的也不是很清晰,因為這不是我的工作,也就沒有第一手資料。)

1、某些人的機器永遠會崩潰,無論是用什麼瀏覽器都一樣;而另一些人的機器則無論如何都複現不出來;

2、對於會崩潰的機器來說,則在某些個頁面上打一開始就崩潰。尤其是IE7,會直接彈出一個紅叉對話方塊,裡面一串十六進位數字,顯示類似Access denied之類的類似C++錯誤提示的東西。.NET不是應該託管安全的麼,怎麼會這樣呢?

3、對於崩潰之前的那一瞬間,既沒有看到佔用記憶體大小有什麼特別不正常,也沒有看到CPU負荷有什麼不正常。 

對於上面的這個疑惑,我們甚至做了個Dump,開始的時候以為是IE7裡面的某個COM組件的錯誤,因為用WinDbg看出錯時堆棧位於當IE視窗大小發生變化之後所經過的代碼。可後來的發現證明完全不是這麼一回事,因為有人做了一個實驗,發現出現崩潰和同一個頁面上有多少個SilverLight應用有關。前面這個條件是必要但非充分的,因為在同一台機器上,有的頁面不崩潰,有的頁面就會崩潰。差異就在於有前者只有1個SilverLight應用,而後者則同時載入並顯示了4個應用。

 

可這解釋不了為什麼有的機器會崩潰,有的則不會。對於這個問題,我們做了不少的假設,比如說:系統記憶體大小,作業系統版本,瀏覽器版本,記憶體流失,沒有正確的處理異常,各種安全執行緒問題,SilverLight核心版本不一致,開發版和普通使用者版,等等,乃至中毒。隨著前面那幾個比較嚴肅的懷疑被一一排除,我們甚至笑談到了人品的問題。因為開發的時候我們從來沒有遇到過這個問題,只是在內部使用的時候,個別美工和設計師會出現這種尷尬的情況,而且沒有一個開發人員能用他自己的開發環境複現這個問題。甚至還有人下載了Silverlight 5 Beta來試,發現臨界值從4個變成了5個。這個結果讓人哭笑不得:有變化了,但解釋不了什麼問題。

  

就在我們一籌莫展的時候,這位同事又做了一個簡化實驗:同時展示4個完全相同的SilverLight,裡面就一個TextBlock,隨便寫了幾個字。就這麼簡單的一個應用,如果一個頁面顯示4個,則會發生崩潰的機器仍然會發生崩潰。這時候我們就開始懷疑,這個問題真的跟我們寫的代碼,乃至.NET Framework中的託管部分沒有任何關係了。進一步的實驗發現,只要輸入中文,或者使用了中文字型,就會崩潰。只要TextBlock中的是一個英文,並且沒有指定字型,或者指定的字型是英文的,就不會崩潰。

 

現在問題指向就比較明顯了:中文,或者中文字型就是元兇。到了這裡,我們恍然大悟,怪不得會發生崩潰的機器,全都是美工和設計師的。這些美工和設計師因為工作需要,會安裝各種你所見過或者從未見過的字型。這時候我們還非常驚訝的發現:

1、我們的Demo裡面並沒有使用任何特殊安裝的字型;

2、即便我們把我們需要的字型打包到XAP裡面,仍然不管用;

3、即便我們顯示的是英文,但只要指定任意一種中文字型,也會崩潰;

4、對於安裝了字型的使用者,如果把註冊表改了(也就是假裝這些字型並未安裝),崩潰的癥狀也就消失了。 

 

這時候我們發現,要解決這個問題,似乎就只能夠告知使用者,把某些有問題的字型給刪掉,或者給他們一個禁用某類字型的指令碼。但到底是哪一個,或者哪一些字型會出現問題呢?同事再次陷入了困境,因為實驗表明:

1、某一些字型一定不會出問題,我們稱為A組;

2、另一些字型則同時存在時,一定會出問題,我們成為B組;

3、將B組字型每三個分成1個小組,隨便禁用任意1小組,就不會崩潰;

4、B組字型非常多,逐個實驗很耗時間,但隨即抽了幾個發現,似乎禁用任意1個,也不會崩潰。

 

正當大家都在討論,這時一個什麼問題的時候。噹噹噹噹!我閃亮登場了,我說:那看起來不是某個字型有什麼畸形的東西在裡面導致了某種原因不明的錯誤,很可能是因為中文字型大小和英文字型大小的原因。儘管很奇怪,比如說崩潰之前記憶體也沒有達到接近2G大小,不應該是OOM這種問題,而且我從來沒有、將來也不會用到的字型,為啥要一股腦兒全部載入進來呢?但也不是不可能的事情,畢竟中文字型和英文字型確實有這個差異。在這個思路下面,我們做了這麼兩個實驗:

 

實驗一:在會發生崩潰的機器上面,把B組字型刪除1個,使得同事顯示4個應用不會發生崩潰,然後再載入第5個應用。結果毫不意外,崩潰了。

實驗二:在之前我們認為不會崩潰的機器上面,載入N個應用,發現在大約載入到30個的時候,也發生崩潰了。注意,不是.NET報告的OOM異常,我們不可能靠自己寫代碼能解決此問題。

目前,我們的進展只到了這裡,進一步的排查和問題的機掘可能會非常困難,因為已經遠超託管範圍內的世界了。這個問題最好是微軟來解決,因為嚴格來說這時一個Bug。但是至少,這個QUIZ的答案有了:

 

如果包含中文,或者指定了任意一個中文字型,則一個頁麵包含1到30個左右的SilverLight應用就可能會導致莫名其妙的無法啟動的崩潰。具體是多少還取決於你的職業,比如你是一個很無趣的程式員,這個數字可能是30甚至更大;但如果你是個天才美工,愛好裝各種各樣牛逼的中文字型,那麼這個數字也許是1;而如果你在程式員和美工之間,這個數字就不定了,最常見的數字可能是3到5。哦,對了,還可能和SilverLight版本有關,比如說SL4的數字是4,那麼SL5的數字就可能是5。

 

嗯,還有一個QUIZ,答案也敬請期待。 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.