我们有一个大型遗留VB应用程序,由许多DLL(大约十几个)组成,全部安装在一个COM + Server应用程序中。偶尔会发生一些导致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是否狡猾并且值得产生新的pdb - 连接到微软的符号服务器,所以他们不应该,但不确定它(显然)报告错误符号的模块( 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
答案 0 :(得分:1)
你有VB dll的符号吗?符号对于获取调用堆栈很重要。我希望你有正确的符号。您可以使用ld *
然后使用lme
来获取windbg中不匹配的符号列表。同时使用_NT_SYMBOL_PATH
最简单的选择之一是在DebugDiag内加载转储,这应该可以为您提供失败原因以及调用堆栈。 DebugDiag具有Complus的调试器扩展。
这是一个针对所有线程的本机调用堆栈的命令
~*ek
并且这一个切换到当前异常
.ecxr
答案 1 :(得分:0)
Debug Mon / WinDbg是解决此问题的最佳方法。 您应该能够使用winDbg中的模块列表或lm命令列出已加载的模块。然后堆栈跟踪应该告诉您涉及哪些DLL。即使没有process / dll的符号,这也应该是可能的。