我正在开发和支持Win32 / .NET应用程序。该应用程序是由.NET模块扩展的非托管/本机可执行文件。在上次发布后,它开始在随机时间崩溃。它只在生产环境中崩溃,我无法重现这个bug。我们通常对所有线程使用try / catch块,但没有记录任何内容。不幸的是,在生产版本中没有AppDomain未处理的异常挂钩。
我得到的唯一信息是在系统事件日志中输入:
Error XX.XX.XXXX XX:XX:XX Application Error 1000 (100) "Faulting application name: XXXXX.EXE, version: X.X.0.0, time stamp: 0xXXXXXXXX Faulting module name: KERNELBASE.dll, version: 6.3.9600.18666, time stamp: 0xXXXXXXXX Exception code: 0xebad53fc Fault offset: 0x00015608 Faulting process id: 0xXXX Faulting application start time: 0xXXXXXXXXXXXXXXX Faulting application path: C:\Program Files (x86)\XXXXX\XXXX.EXE Faulting module path: C:\WINDOWS\SYSTEM32\KERNELBASE.dll Faulting package full name: Faulting package-relative application ID: " Error XX.XX.XXXX XX:XX:XX .NET Runtime 1026 None Application: XXXXX.EXE Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: exception code ebad53fc, exception address 753B5608 Stack:
事件日志中存储的事件告诉我.NET代码出错了。
我已经请求我的客户使用Windows任务管理器在每次应用程序崩溃后创建崩溃转储。几天之后我的DMP文件很少,但那里没有有趣的信息。大多数线程处于等待或GetMessage(UI)状态。没有KERNELBASE.dll!_UnhandledExceptionFilter或类似的过程调用。崩溃转储没有关于异常和异常代码的信息。一切都很好。
我做了一些实验,并从.NET代码手动启动了一些应用程序崩溃。实验性故障转储包含有用的信息。特别是堆栈帧从.NET代码传递到KERNELBASE.dll!_UnhandledExceptionFilter。
我想知道为什么来自客户的崩溃转储看起来很好以及为什么事件日志中记录的事件说错误模块是KERNELBASE.DLL,但是在.NET运行时发生了错误。