代码之家  ›  专栏  ›  技术社区  ›  Callie J

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

  •  0
  • Callie J  · 技术社区  · 14 年前

    系统调用了一个自定义组件,而该组件 失败并生成异常。这表示发动机有问题 自定义组件。通知此组件的开发人员发生故障
    服务器应用程序ID:{8CC02F18-2733-4A17-9E5C-1A70CB6B6977}
    服务器应用程序实例ID:{1940A147-8A5E-45FA-86FE-DAF92A822597}

    此错误的严重性质导致进程终止。

    地址:0x758DA3DA

    资料来源:康普卢斯

    级别:错误

    旁边是另一根木头,特别是在进程空间...

    错误应用程序名称:进程空间,版本:6.0.6000.16386,时间戳:0x4549b14e

    异常代码:0xc0000005
    故障偏移量:0x0000a3da
    出错进程id:0x83c
    故障应用程序开始时间:0x01cb50c507ee0166

    出错的模块路径:%12

    我知道它在C运行时(msvcrt)中标记失败,但理想情况下,我需要将其追溯到调用到msvcrt的DLL中(可能有错误的数据/参数)。那么,在不安装调试器的情况下,有没有办法识别导致这种情况的DLL呢?我想看看是否有一个内存转储的地方,我可以用来分析离线-从而联系到特定的地址。但如果没有这些,我不确定这是可能的。 当托管应用程序崩溃时,是否可以告诉COM子系统生成一个小型转储? (是的,它可以[可能]-“转储”选项卡上有一个复选框)。

    这是在WindowsServer2008R132位上的(但也对Server2003感兴趣)。

    它不会影响应用程序的可用性--COM+只需重新启动dllhost,应用程序就会继续运行,但这是一个需要解决的问题。

    编辑 好吧,我有一个紧急停车场,我有windbg,但这没用。我不知道我是不是很厚(一种可能性)或是其他的东西:-)输出的 !analyze -v 在下面,但它没有显示我在我们的DLL中的任何内容,虽然它看起来似乎还没有能够解决故障的IP?我不知道下一步该转向哪里。

    我想知道我的pdb是否有可疑之处,是否值得生成新的——连接到Microsoft的symbol server,所以它们不应该是,但不确定它(显然)为哪个模块报告了错误的符号(BUGCHECK \u STR和PRIMARY \u PROBLEM \u CLASS)(或者这些符号是最初运行代码的服务器上的吗?)。把pdb放在服务器上会更好吗?

    *******************************************************************************
    *                                                                             *
    *                        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 回复  |  直到 14 年前
        1
  •  1
  •   Naveen    14 年前

    你有VB DLL的符号吗?符号对于获取调用堆栈很重要。我希望你有正确的符号。你可以用 ld * 然后 lme _NT_SYMBOL_PATH

    最简单的选择之一是在 DebugDiag 这应该会给出失败的原因以及调用堆栈。DebugDiag具有Complus的调试器扩展。

    ~*ek
    

    这个切换到当前的异常

    .ecxr
    
        2
  •  0
  •   Mike    14 年前

    推荐文章