我的软件最近被部署给一个客户,他说应用程序在启动后立即崩溃。经过一些初步调试后,客户向我提供了对其中一台无法运行该应用程序的计算机的远程访问权限。 我发现崩溃并非特定于我的应用程序。任何依赖 .NET 框架的应用程序都会立即崩溃。
方便的是,Visual Studio 2008 已安装,因此我在其上创建了一个快速的 hello world 应用程序并单击调试。该应用程序运行良好。但是,当我尝试在 Visual Studio 之外的 /bin/Debug/HelloWorld.exe 目录中执行生成的二进制文件时,它崩溃了。
我尝试过的事情清单(更新):
- 我检查了“每个人”是否具有 c:\Windows 的读取和执行权限。
- 为了测试问题出在 .NET Framework(而不是我的应用程序)上,我尝试将 Paint .NET 下载到计算机上。设置前端以相同的方式崩溃。
- 按照http://support.microsoft.com/kb/908077中的说明对 .NET 框架进行了修复(男孩既有趣又耗时)。没运气。
- 安装了 .NET 3.5 SP1(在它只有 .NET 3.5 之前) 注意:我的应用程序针对 2.0,所以我做的更多是长镜头......但我在这个过程中了解到 .NET 3.5 SP1 也更新了底层框架。
- Ran Aaron Stebner 的 .NET 设置验证工具。此工具表明 .NET 已成功安装。(我忘记了我是否检查了所有版本,但至少 2.0 有效)。
- 测试了一些针对 .NET 2.0 和 .NET 3.5 的迷你 hello world 应用程序,它们都以相同的方式崩溃。
- 尝试通过 windbg cmd 行启动 .NET 应用程序。这样做确实允许我调用我简单的 hello world 应用程序。因此,简单的 .NET hello world 在由 windbg 调用或通过在 Visual Studio 中通过调试启动时可以工作......但如果我尝试独立执行它则不会。
我使用 WinDbg 创建了一个转储文件。这对我来说并没有那么大。
FAULTING_IP: mscorwks!PEImage::GetEntryPointToken+21 79f4ff9d f6401010 test byte ptr [eax+10h],10h
EXCEPTION_RECORD: 0012f710 -- (.exr 0x12f710) ExceptionAddress: 79f4ff9d (mscorwks!PEImage::GetEntryPointToken+0x00000021) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 00000000 Parameter[1]: 00000010 Attempt to read from address 00000010
FAULTING_THREAD: 00000b44
PROCESS_NAME: MyProcess.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid
DETOURED_IMAGE: 1
NTGLOBALFLAG: 0
APPLICATION_VERIFIER_FLAGS: 0
MANAGED_STACK: !dumpstack -EE OS Thread Id: 0xb44 (0) Current frame: ChildEBP RetAddr Caller,Callee
EXCEPTION_OBJECT: !pe cb10b4 Exception object: 00cb10b4 Exception type: System.ExecutionEngineException Message: <none> InnerException: <none> StackTrace (generated): <none> StackTraceString: <none> HResult: 80131506
MANAGED_OBJECT_NAME: System.ExecutionEngineException
CONTEXT: 0012f72c -- (.cxr 0x12f72c) eax=00000000 ebx=00000000 ecx=00000000 edx=0000000e esi=001a1490 edi=00000001 eip=79f4ff9d esp=0012f9f8 ebp=0012fa1c iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246 mscorwks!PEImage::GetEntryPointToken+0x21: 79f4ff9d f6401010 test byte ptr [eax+10h],10h ds:0023:00000010=?? Resetting default scope
READ_ADDRESS: 00000010
FOLLOWUP_IP: mscorwks!PEImage::GetEntryPointToken+21 79f4ff9d f6401010 test byte ptr [eax+10h],10h
BUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_SHUTDOWN
PRIMARY_PROBLEM_CLASS: NULL_CLASS_PTR_DEREFERENCE_SHUTDOWN
DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_SHUTDOWN
LAST_CONTROL_TRANSFER: from 79ef02b5 to 79f4ff9d
STACK_TEXT: 79f4ff9d mscorwks!PEImage::GetEntryPointToken+0x21 79ef02b5 mscorwks!PEFile::GetEntryPointToken+0xa0 79eefeaf mscorwks!SystemDomain::ExecuteMainMethod+0xd4 79fb9793 mscorwks!ExecuteEXE+0x59 79fb96df mscorwks!_CorExeMain+0x15c 7900b1b3 mscoree!_CorExeMain+0x2c 7c817077 kernel32!BaseProcessStart+0x23
SYMBOL_STACK_INDEX: 0
SYMBOL_NAME: mscorwks!PEImage::GetEntryPointToken+21
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: mscorwks
IMAGE_NAME: mscorwks.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 471ef729
STACK_COMMAND: .cxr 0012F72C ; kb ; dds 12f9f8 ; kb
FAILURE_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_SHUTDOWN_80000003_mscorwks.dll!PEImage::GetEntryPointToken
BUCKET_ID: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_SHUTDOWN_DETOURED_mscorwks!PEImage::GetEntryPointToken+21
WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/MyProcess_exe/2_4_4_39/4a8a192c/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1
Followup: MachineOwner
编辑 1:此错误的事件日志详细信息表明它是 .NET 运行时版本 2.0.50727.3053 - 致命执行引擎错误 (7A097706)(80131506)。
(来源:blakerbertson.com)
编辑 2 (10-7-09):此问题仍然存在。
编辑3(3-29-10):本次更新是为了让大家知道我从来没有成功解决过问题。这台机器的客户对解决它失去了兴趣,只是重新映像了机器:(。感谢所有的贡献。