繁体   English   中英

如何使.NET 4抛出ExecutionEngineException?

[英]How to cause .NET 4 to throw ExecutionEngineException?

我们的应用程序有时会引发ExecutionEngineException 我认为当它发生时,应用程序应该崩溃,但它不会崩溃。 即使事件查看器声称应用程序已终止 - 它仍继续运行! 只是看起来有问题的线程被静默杀死。

问题是我们无法在发生时重新创建条件 - 可疑代码在异常发生之前执行了数千次。 日志中没有任何内容。 简而言之 - 我们感到困惑。

我希望能够随意生成此异常,以便了解应用程序在发生时的行为方式。 当然,它必须由框架本身throw new ExecutionEngineExceptionthrow new ExecutionEngineException不计算。

所以,我的问题是 - 我怎样才能可靠地引起它? 请提供代码示例。

我们在.NET 4上,很快就转向.NET 4.5

MSDN文档

在某些情况下,当应用程序或运行它的系统负载很重时,以.NET Framework为目标的应用程序可能会在垃圾回收期间抛出ExecutionEngineException异常。 在这种情况下,要解决此问题,可以通过修改应用程序的配置文件来禁用并发垃圾回收。 有关更多信息,请参见如何:禁用并发垃圾收集

如果MSDN文档建议的解决方法不适合您,则必须根据您对软件的了解进行测试。

现在,创建一个模拟真实应用程序的负载,多线程行为和内存消耗的测试应用程序是一回事 - 使用实际软件作为测试软件可能更好(可能增加了一些额外的调试日志+测试代码) 。 这意味着,遗憾的是这里没有代码示例:(

要使负载测试有意义,您还需要在测试系统上运行这些测试,该测试系统具有与生产系统非常相似(如果不是相同的)硬件/软件配置。 只有这样,您才能确定您的ExecutionEngineException是由GC还是由其他损坏的运行时引起的。

除非重现问题(即使必须在生产环境中执行此操作),否则不能轻易导致ExecutionEngineException。 Microsoft具有DebugDiag等实用程序,可以帮助您在发生此类异常时捕获完整的内存转储,

http://blogs.msdn.com/b/chaun/archive/2013/09/15/steps-to-trigger-a-user-dump-of-a-process-with-debugdiag-1-2-when-一个特定的净例外是,thrown.aspx

通过转储分析,很容易找到罪魁祸首。 不要指望你的日志可以告诉你,因为当这个异常发生时CLR崩溃,你的日志永远不会那么深。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM