6

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

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

我希望能够随意生成这个异常,以便了解我们的应用程序在它发生时的行为方式。当然必须是框架自己抛出的,发行throw new ExecutionEngineException不算。

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

我们在 .NET 4 上,很快就会迁移到 .NET 4.5

4

2 回答 2

4

MSDN 文档

在某些情况下,以 .NET Framework 为目标的应用程序可能会在垃圾回收期间引发 ExecutionEngineException 异常,而此时应用程序或运行它的系统处于高负载状态。在这种情况下,要解决此问题,您可以通过修改应用程序的配置文件来禁用并发垃圾回收。有关详细信息,请参阅 如何:禁用并发垃圾收集

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

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

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

于 2013-10-30T00:54:33.433 回答
1

除非您重现问题(即使您必须在生产环境中这样做),否则您不能轻易导致 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- a-specific-net-exception-is-throw.aspx

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

于 2013-10-30T03:09:15.443 回答