如何使.NET 4抛出ExecutionEngineeException?

如何使.NET 4抛出ExecutionEngineeException?,.net,executionengineexception,.net,Executionengineexception,我们的应用程序有时会引发ExecutionEngineeException。我认为当它发生时,应用程序应该崩溃,但它不会崩溃。即使事件查看器声明应用程序已终止,它也会继续运行!似乎只有冒犯的线程被默默地杀死了 问题是,我们无法在发生异常时重新创建条件-在异常发生之前,可疑代码执行了数千次。日志里什么也没有。 简言之,我们感到困惑 我希望能够随意生成此异常,以便了解应用程序在发生异常时的行为。当然,它必须由框架本身抛出,发出throw new executionEngineeException不算

我们的应用程序有时会引发
ExecutionEngineeException
。我认为当它发生时,应用程序应该崩溃,但它不会崩溃。即使事件查看器声明应用程序已终止,它也会继续运行!似乎只有冒犯的线程被默默地杀死了

问题是,我们无法在发生异常时重新创建条件-在异常发生之前,可疑代码执行了数千次。日志里什么也没有。 简言之,我们感到困惑

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

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

我们在.NET 4上,很快将从以下位置转到.NET 4.5:

在某些情况下,以.NET Framework为目标的应用程序可能会 在垃圾收集期间引发ExecutionEngineeException异常 当应用程序或其运行的系统处于 重载。在这种情况下,要解决此问题,可以禁用 通过修改应用程序的 配置文件。有关详细信息,请参阅

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

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


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

您不能se ExecutionEngineeException很容易,除非您重新生成该问题(即使您必须在生产环境中执行)。Microsoft具有诸如DebugDiag之类的实用程序,可以在发生此类异常时帮助您捕获完整内存转储


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

我非常确信EEE可以在压力较小的情况下发生。浏览网页会给人一种印象,即动态发出的IL代码可能会导致这种异常异常。如果错误的“手工制作”IL代码是罪魁祸首,作为第一个猜测,您的问题更有可能以一致的方式再现。该问题只是“有时”发生,作为第一个猜测,它指向与耗尽资源或比赛条件有关的某个问题。无论如何,所有这些都是可能的原因,您将不会有问题除了检查这些可能性,直到找到问题的原因之外,还有其他方法:(这就是问题所在,CLR不会崩溃。如果我们仅仅通过分析转储来解决问题,我就不会发布这个问题。怀疑引发它的代码来自一个经过公平测试的库,而且正如我已经提到的,在EEE出现条件之前,相同的路径被执行了数千次。我仍然不相信确认此异常不能在实验室中随意生成。“不会崩溃”当这个异常发生时,CLR不能可靠地恢复它自己。进程终止并不总是我们追赶的标志。如果您只考虑终止为崩溃,那么请让我知道,我将删除我的无用的答案。事实上,你使用的开源库是非常危险的,因为它可能会遇到回归问题。NET框架,因为它可以直接操作IL。既然你想在实验室复制它,我祝你好运。