19

我的软件最近被部署给一个客户,他说应用程序在启动后立即崩溃。经过一些初步调试后,客户向我提供了对其中一台无法运行该应用程序的计算机的远程访问权限。 我发现崩溃并非特定于我的应用程序。任何依赖 .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)。

DotNetFatalExecutionError 截图
(来源:blakerbertson.com

编辑 2 (10-7-09):此问题仍然存在。

编辑3(3-29-10):本次更新是为了让大家知道我从来没有成功解决过问题。这台机器的客户对解决它失去了兴趣,只是重新映像了机器:(。感谢所有的贡献。

4

14 回答 14

8

根据您的 windbg 输出,看起来有人在进程启动时将 DLL 注入到进程中,并且该注入不是为已加载的任何版本的 mscorwks 设计的。如果这是一个临时工作站(例如秘书),我会没收它以供 MIS/IT 检查恶意软件。如果它是位于服务器机房中的机器,我会期待客户重新定位到另一台机器。

我不怀疑这会发生在任何其他客户身上,并且在 8 年的 .NET 开发中,唯一可以(预期)导致您所描述的行为的事情是尝试在具有较旧的系统上运行 .NET 应用程序安装的框架版本(例如,缺乏支持,导致在大多数版本的 Windows 上出现标准调试/取消对话框),这不是问题所在。这也与处理器架构、框架版本或 SP 级别无关,与任何商业 AV 软件或任何商业网络安全软件无关。

这显然不是您的代码中的内容,而且我认为您无法为您的客户修复它。我不知道没有工具或一系列步骤可以用来解决这个问题,除非让客户重新映像目标机器。在他们这样做之前,再次让 MIS/IT 为潜在的恶意软件(特别是不会通过公众分发的恶意软件)隐藏它。

相关阅读:http ://research.microsoft.com/apps/pubs/default.aspx?id=68568

祝你好运。

于 2009-09-25T06:17:14.080 回答
3

我们团队的一些成员最近遇到了同样的问题,他们发现通过 Wave System 卸载后Embassy Trust Suite一切恢复正常。以下链接导致了答案。

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/6e6b8496-c1f1-4fc9-bcc9-2129a6329804/

作为调查的一部分,他们也遇到了这个 SO 问题,并要求我将其发布为可能对其他人有所帮助的解决方案。

于 2011-08-16T10:10:53.453 回答
1

几个月前我遇到了类似的问题(虽然我不记得错误代码)。在尝试了很多事情之后,以下解决了这个问题(据我所知):

删除 .net 临时文件夹中的所有临时文件(并检查该文件夹的权限)

于 2009-09-24T02:51:07.657 回答
1

我最近遇到了同样的问题,并执行了这些步骤Microsoft .NET 应用程序崩溃,它纠正了 .NET 应用程序无目的崩溃

于 2010-11-19T14:44:10.133 回答
1

有同样的问题,它是通过使用发布向导修复的。这就是我发现目标机器没有安装 Visual Basic Powerpack 3.0 包的原因。安装后,它就像一个魅力。

于 2010-02-11T05:30:26.660 回答
1

我们在大规模部署中遇到了一个非常相似的问题,在所有情况下,在框架上运行修复修复了这个问题,我会试一试。

于 2009-09-22T23:17:27.200 回答
0

使用 WinDbg 启动它。使用“罢工之子”,您应该能够确切地看到它崩溃的原因。可能存在低级别的程序集加载错误。我过去使用 WinDbg 遇到过类似的问题。

于 2009-09-23T23:12:00.283 回答
0

确保用户没有从网络共享启动应用程序。默认情况下,.Net 在尝试从不受信任的来源启动应用程序时会引发安全异常。

您可以使用管理工具中的 Microsoft .Net Framework 配置实用程序更改此行为。

于 2009-09-23T23:16:21.360 回答
0

还有几个建议可以尝试:

  • 只是为了确保它不是 vshost.exe 问题,我会尝试在 cdb/windbg 下运行 MyProcess.exe 并查看行为。
  • 该问题看起来像 Read AV,如果应用程序在调试器下正常工作,我会尝试修复我的 .Net 安装,以防操作系统将 .Net 程序集的执行移交给 mscorwks.dll 的方式可能存在损坏。
于 2009-09-22T19:43:27.997 回答
0

听起来你在那里得到了一个“有趣”的人。我不知道,但无论如何,这是我的业力嫖娼暗中刺伤的建议。

1) 除了 Windows 分配的常规用户权限外,还有一组单独的安全设置,专门针对 .NET 框架。如果您安装了 .NET SDK,请在“控制面板”中查找“Microsoft .NET Framework 配置”工具(可能位于“管理工具”下)。查看是否有任何设置与您的开发机器不同。

2) 我猜你的客户在他的工作场所受到 IT 制度的控制。看看您或您的客户是否可以在程序运行的地方获得全新的 Windows 安装,然后与他的 IT 团队合作,一次应用他们的要求之一(安全设置、防病毒程序等),直​​到您的程序停止在职的。一个很好的旧的最后一个工作状态的 bug-hunt。当然,这需要他的 IT 部门的合作,所以我希望你的程序对某个地方的主管很重要。

于 2009-09-22T19:31:14.870 回答
0

没有灵丹妙药修复,我不认为这是一个权限问题。

这是我会尝试的

  1. 如果它是 64 位机器,请尝试切换到 32 位模式,我已经看到 32 位 dll 尝试以 64 位运行。
  2. 在服务器上创建一个新网站并在其上运行 aspnet_regiis。
  3. 卸载并重新安装 2.0 和 3.5 框架。确保完成后运行 aspnet_regiis
于 2009-09-22T19:36:00.767 回答
0

由于它不会发生在每台客户端机器上,它会是 RAM 吗?你能重新启动坏机并运行内存诊断工具吗?

在过去的某个时间点是否可以为这台机器打开 DEP?对于这种安全性,您不会获得 .Net 异常,因为您的应用程序根本无法运行,因此几乎没有机会引发错误。

于 2009-09-24T21:59:46.123 回答
0

可能此链接可以帮助您解决问题修复错误“.NET 运行时版本 2.0.50727.3053 – 致命执行引擎错误”[.NET]

您的客户电脑安装了什么操作系统(Windows XP、Vista 等)?

您是否尝试过完全卸载 .NET Framework(不是修复)然后重新安装?

于 2009-09-25T06:34:21.503 回答
0

我最近遇到了一个以非常相似的方式表现出来的问题。事实证明,某些第三方 DLL 不是我的部署的一部分(我只是从 bin 目录中复制内容)。我创建了一个安装应用程序,它拾取了所有 DLL,一旦正确部署,它就会停止崩溃。奇怪的是,这是一次艰难的失败,而不是一个例外。

这可能不适用于您,因为您说它适用于任何 .NET 应用程序。也许您正在处理带有一些剩余引用的旧项目文件?

于 2010-02-16T21:12:35.703 回答