我们有一个大型的遗留 VB 应用程序,由许多 DLL(几十个左右)组成,全部安装到一个 COM+ 服务器应用程序中。时不时会发生一些事情,导致 dllhost.exe 崩溃(并自动重新启动),并在 Windows 应用程序事件日志中留下此消息...
系统调用了一个自定义组件,该组件发生故障并生成异常。这表明自定义组件存在问题。通知该组件的开发人员发生了故障,并向他们提供以下信息。
服务器应用程序 ID:{8CC02F18-2733-4A17-9E5C-1A70CB6B6977}
服务器应用程序实例 ID:{1940A147-8A5E-45FA-86FE-DAF92A822597}
服务器应用程序名称:MyTestApp
此错误的严重性质已导致进程终止。
例外:C0000005
地址:0x758DA3DA来源:Complus
事件 ID:4786
级别:错误
除此之外,还有另一个日志,特别是在 dllhost.exe 上...
错误应用程序名称:dllhost.exe,版本:6.0.6000.16386,时间戳:0x4549b14e
错误模块名称:msvcrt.dll,版本:7.0.6002.18005,时间戳:0x49e0379e
异常代码:0xc0000005
错误偏移量:0x0000a3da 错误
进程 id:0x83c
应用程序开始时间: 0x01cb50c507ee0166
错误应用程序路径: %11
错误模块路径: %12
报告 ID: %13
我知道它标记了 C 运行时 (msvcrt) 中的故障,但理想情况下,我需要将其追溯到调用到 msvcrt 的 DLL(可能带有错误的数据/参数)。那么在不安装调试器的情况下,有什么方法可以识别导致这种情况的 DLL 吗?我正在尝试查看是否有任何可用于离线分析的内存转储 - 从而将地址与特定内容联系起来。但没有那个,我不确定这是可能的。是否可以告诉 COM 子系统在托管应用程序崩溃时生成小型转储?(是的,它可以[可能] - “转储”选项卡上有一个复选框)。
这是在 Windows Server 2008 R1 32 位上(但也对 Server 2003 感兴趣)。
它不会影响应用程序的可用性——COM+ 只是重新启动 dllhost 并且应用程序会继续运行,但它会带来一些不便,需要修复。
编辑好吧,我有一个崩溃转储,我有windbg,但它没有帮助。不确定我是不是很厚(一种可能性)或其他东西:-) 的输出!analyze -v
低于,但它没有显示我们的 DLL 中的任何内容,尽管它看起来无法解析 FAULTING_IP?我不确定下一步该转向哪里。
我想知道我的任何 pdb 是否有问题并且值得生成新的 - 连接到 Microsoft 的符号服务器,所以它们不应该,但不确定它(显然)报告错误符号的模块是什么(BUGCHECK_STR 和 PRIMARY_PROBLEM_CLASS ) (或者这些符号是在最初运行代码的服务器上吗?)。将 PDB 放在服务器本身上会更好吗?
如果没有,还有其他想法吗?我之前曾短暂使用过windbg,但我不是它的常规用户,所以也许我需要输入更多的咒语才能更深入地挖掘?欢迎指导:-)
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
FAULTING_IP:
+5c112faf02e0d82c
00000000 ?? ???
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
FAULTING_THREAD: 00000f1c
DEFAULT_BUCKET_ID: WRONG_SYMBOLS
PROCESS_NAME: dllhost.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid
MOD_LIST: <ANALYSIS/>
NTGLOBALFLAG: 0
APPLICATION_VERIFIER_FLAGS: 0
MANAGED_STACK: !dumpstack -EE
OS Thread Id: 0xf1c (0)
Current frame:
ChildEBP RetAddr Caller,Callee
LAST_CONTROL_TRANSFER: from 77b15620 to 77b15e74
PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS
BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS
STACK_TEXT:
0022fa68 77b15620 77429884 00000064 00000000 ntdll!KiFastSystemCallRet
0022fa6c 77429884 00000064 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0022fadc 774297f2 00000064 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xbe
0022faf0 778e2c44 00000064 ffffffff 00e42374 kernel32!WaitForSingleObject+0x12
0022fb0c 778e2e32 00060848 0022fb5b 00000000 ole32!CSurrogateProcessActivator::WaitForSurrogateTimeout+0x55
0022fb24 00e413a4 0022fb40 00000000 00061d98 ole32!CoRegisterSurrogateEx+0x1e9
0022fcb0 00e41570 00e40000 00000000 00061d98 dllhost!WinMain+0xf2
0022fd40 7742d0e9 7ffde000 0022fd8c 77af19bb dllhost!_initterm_e+0x1a1
0022fd4c 77af19bb 7ffde000 dc2ccd29 00000000 kernel32!BaseThreadInitThunk+0xe
0022fd8c 77af198e 00e416e6 7ffde000 ffffffff ntdll!__RtlUserThreadStart+0x23
0022fda4 00000000 00e416e6 7ffde000 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: .cxr 00000000 ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kb
FOLLOWUP_IP:
dllhost!WinMain+f2
00e413a4 ff15a410e400 call dword ptr [dllhost!_imp__CoUninitialize (00e410a4)]
SYMBOL_STACK_INDEX: 6
SYMBOL_NAME: dllhost!WinMain+f2
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: dllhost
IMAGE_NAME: dllhost.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 4549b14e
FAILURE_BUCKET_ID: WRONG_SYMBOLS_80000003_dllhost.exe!WinMain
BUCKET_ID: APPLICATION_FAULT_WRONG_SYMBOLS_dllhost!WinMain+f2