我们有一个针对.NET 4.0编写的应用程序,它在周末崩溃,将以下消息放入事件日志中:
应用程序:PnrRetrieverService.exe Framework版本:v4.0.30319
描述:由于.NET运行时在IP 791F9AAA(79140000)处出现内部错误而导致进程终止,退出代码为80131506.
这是在Windows Server 2003 R2标准版框中.谷歌搜索这个错误没有发现任何相关的.例如,这不是在VS Studio中发生的,而是在生产框中发生; 当服务最终重新启动时,它没有遇到任何进一步的问题.
如何诊断.NET运行时中的错误?
我正在运行OSX,使用Clang编译一些使用OSX Cocoa类的Obj-C代码,我正在尝试使用LLVM JIT编译器运行结果.我正在使用LLVM/Clang的最新版本.
编译或链接我的代码没有问题,我可以毫无困难地愉快地进行C和C++系统调用.但是我所有的Obj-C调用都惨遭失败,而且我不能深入研究原因!该objc_msgSend()函数似乎被正确调用,但运行时拒绝识别最简单的选择器.
我设法使用Clang和LLI重现问题,这是如何做到的:
创建一个简单的文件test.mm:
#include <Cocoa/Cocoa.h>
#include <cstdio>
#include <iostream>
extern "C" int main (int, char**)
{
std::cout << "==== step 1" << std::endl;
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[pool release];
std::cout << "==== step 2" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
..用clang将它编译成bitcode:
clang -emit-llvm test.mm -c -o test.bc
Run Code Online (Sandbox Code Playgroud)
然后用lli运行它:
lli -load=/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation test.bc
Run Code Online (Sandbox Code Playgroud)
lli的输出如下所示:
==== step 1
objc[45353]: Object 0x101a362a0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() …Run Code Online (Sandbox Code Playgroud) 根据MSDN的说法,有一个"提示"指出,在重负载下运行的.NET应用程序具有并发垃圾收集(无论是<gcConcurrent enabled="true"/>指定的还是未指定的,因为它是默认行为)可能会抛出ExecutionEngineException.是否有人知道Microsoft知识库文章或其他来源提供了额外的背景知识?
我们直接使用基于NHibernate 3.2的Windows服务应用程序,经过最多几个小时的运行后,它总是会崩溃.我们能够跟踪ISession.Flush()调用的异常.
nhusers上有一个线程报告似乎是同一个问题.他建议的解决方法,即禁用并发GC,到目前为止对我们有用,虽然切换到服务器模式GC(<gcServer enable="true"/>),隐式禁用并发GC,也做了伎俩.
在将此作为错误提交给MS之前,我想知道是否有人提供有关并发GC不稳定性的其他信息.
我有一个非常大的应用程序.我的应用程序有时抛出System.ExecutionEngineException,我无法找到此异常的来源.有什么办法找到它吗?
我们的应用程序有时会引发一种情况ExecutionEngineException.我认为当它发生时,应用程序应该崩溃,但它不会崩溃.即使事件查看器声称应用程序已终止 - 它仍继续运行!只是看起来有问题的线程被静默杀死.
问题是我们无法在发生时重新创建条件 - 可疑代码在异常发生之前执行了数千次.日志中没有任何内容.简而言之 - 我们感到困惑.
我希望能够随意生成此异常,以便了解应用程序在发生时的行为方式.当然,它必须由框架本身抛出,发布throw new ExecutionEngineException不计算在内.
所以,我的问题是 - 我怎样才能可靠地引起它?请提供代码示例.
我们在.NET 4上,很快就转向.NET 4.5
我正在尝试引发一个由弱事件处理程序(通过PropertyChangedEventManager)监听的PropertyChanged事件.出于某种原因,我在举起事件时遇到了ExecutionEngineException.
我的事件提升代码如下:
protected virtual void RaisePropertyChanged(string aPropertyName)
{
var lHandler = this.PropertyChanged;
if (lHandler != null)
{
// ExecutionEngineException is thrown here
lHandler(this, new PropertyChangedEventArgs(aPropertyName));
}
return;
}
Run Code Online (Sandbox Code Playgroud)
我的处理代码如下:
public bool ReceiveWeakEvent(Type aManagerType, object aSender, EventArgs e)
{
bool lHandled = false;
if (aManagerType == typeof(PropertyChangedEventManager))
{
OnPropertyChanged(aSender, e as PropertyChangedEventArgs);
}
return lHandled;
}
Run Code Online (Sandbox Code Playgroud)
当我搜索此异常时,我没有得到任何有用的结果,并且异常本身不包含任何有用的信息!是什么导致了这个问题?
c# weak-references inotifypropertychanged executionengineexception