“自定义组件”上的COM异常 - 如何识别DLL?

时间:2010-09-16 09:19:45

标签: dll vb6 windbg com+ dllhost

我们有一个大型遗留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

2 个答案:

答案 0 :(得分:1)

你有VB dll的符号吗?符号对于获取调用堆栈很重要。我希望你有正确的符号。您可以使用ld *然后使用lme来获取windbg中不匹配的符号列表。同时使用_NT_SYMBOL_PATH

设置MS符号的符号路径以及自定义代码

最简单的选择之一是在DebugDiag内加载转储,这应该可以为您提供失败原因以及调用堆栈。 DebugDiag具有Complus的调试器扩展。

这是一个针对所有线程的本机调用堆栈的命令

~*ek

并且这一个切换到当前异常

.ecxr

答案 1 :(得分:0)

Debug Mon / WinDbg是解决此问题的最佳方法。 您应该能够使用winDbg中的模块列表或lm命令列出已加载的模块。然后堆栈跟踪应该告诉您涉及哪些DLL。即使没有process / dll的符号,这也应该是可能的。