[英]How to cause .NET 4 to throw ExecutionEngineException?
我們的應用程序有時會引發ExecutionEngineException
。 我認為當它發生時,應用程序應該崩潰,但它不會崩潰。 即使事件查看器聲稱應用程序已終止 - 它仍繼續運行! 只是看起來有問題的線程被靜默殺死。
問題是我們無法在發生時重新創建條件 - 可疑代碼在異常發生之前執行了數千次。 日志中沒有任何內容。 簡而言之 - 我們感到困惑。
我希望能夠隨意生成此異常,以便了解應用程序在發生時的行為方式。 當然,它必須由框架本身throw new ExecutionEngineException
, throw new ExecutionEngineException
不計算。
所以,我的問題是 - 我怎樣才能可靠地引起它? 請提供代碼示例。
我們在.NET 4上,很快就轉向.NET 4.5
從MSDN文檔 :
在某些情況下,當應用程序或運行它的系統負載很重時,以.NET Framework為目標的應用程序可能會在垃圾回收期間拋出ExecutionEngineException異常。 在這種情況下,要解決此問題,可以通過修改應用程序的配置文件來禁用並發垃圾回收。 有關更多信息,請參見如何:禁用並發垃圾收集 。
如果MSDN文檔建議的解決方法不適合您,則必須根據您對軟件的了解進行測試。
現在,創建一個模擬真實應用程序的負載,多線程行為和內存消耗的測試應用程序是一回事 - 使用實際軟件作為測試軟件可能更好(可能增加了一些額外的調試日志+測試代碼) 。 這意味着,遺憾的是這里沒有代碼示例:(
要使負載測試有意義,您還需要在測試系統上運行這些測試,該測試系統具有與生產系統非常相似(如果不是相同的)硬件/軟件配置。 只有這樣,您才能確定您的ExecutionEngineException是由GC還是由其他損壞的運行時引起的。
除非重現問題(即使必須在生產環境中執行此操作),否則不能輕易導致ExecutionEngineException。 Microsoft具有DebugDiag等實用程序,可以幫助您在發生此類異常時捕獲完整的內存轉儲,
通過轉儲分析,很容易找到罪魁禍首。 不要指望你的日志可以告訴你,因為當這個異常發生時CLR崩潰,你的日志永遠不會那么深。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.