环境:win2003+sp2 .net 2.0(已经打了2个kb)
在写的个服务程序中,动态加载了一些com,
动态调用com执行正常.
但是过了一会在垃圾回收的时候会报Access violation错误.
猜测是调用的COM的问题,但是是那一类的问题就不知道了,偶对C++不熟悉 :(
以下是windbg分析的些信息:
(c40.da8): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000102 ebx=00000000 ecx=7c821d43 edx=7c9585ec esi=000007b4 edi=7c821c7b
eip=0a9b2d3c esp=0d6bffb0 ebp=0d6bffec iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
0a9b2d3c ??              ???
0:018> !gle
LastErrorValue: (Win32) 0x3e5 (997) -      I/O
LastStatusValue: (NTSTATUS) 0x103 - <Unable to get error code text>0:014> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
************************************************************************************ OS symbols are WRONG. Please fix symbols to do analysis.***** OS symbols are WRONG. Please fix symbols to do analysis.*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: ntdll!_PEB                                    ***
***                                                                   ***
*************************************************************************
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for advapi32.dll - 
*** WARNING: Unable to verify checksum for System.ServiceProcess.ni.dll
*** ERROR: Module load completed but symbols could not be loaded for System.ServiceProcess.ni.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ole32.dll - 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for rpcrt4.dll - 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for comsvcs.dll - 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for msjet40.dll - FAULTING_IP: 
+aa02d3c
0aa02d3c ??              ???EXCEPTION_RECORD:  ffffffff -- (.exr ffffffffffffffff)
ExceptionAddress: 0aa02d3c
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 0aa02d3c
Attempt to read from address 0aa02d3cPROCESS_NAME:  FLSService.exeFAULTING_MODULE: 7c930000 ntdllDEBUG_FLR_IMAGE_TIMESTAMP:  4333e7ecERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"READ_ADDRESS:  0aa02d3c BUGCHECK_STR:  ACCESS_VIOLATIONMANAGED_STACK: !dumpstack -EE
OS Thread Id: 0x748 (14)
Current frame: 
ChildEBP RetAddr  Caller,CalleeLAST_CONTROL_TRANSFER:  from 00000000 to 0aa02d3cFAILED_INSTRUCTION_ADDRESS: 
+aa02d3c
0aa02d3c ??              ???SYMBOL_ON_RAW_STACK:  1STACK_ADDR_RAW_STACK_SYMBOL: 17002000010004STACK_COMMAND:  dds 0D61EC80-0x20 ; kbSTACK_TEXT:  
0d61ec60  00000000
0d61ec64  0d61ec78
0d61ec68  7c821c8d kernel32!WaitForSingleObject+0x12
0d61ec6c  0000040c
0d61ec70  00004e20
0d61ec74  00000000
0d61ec78  0d61eca8
0d61ec7c  7a0066fe mscorwks!GetCompileInfo+0x4078f
0d61ec80  0000040c
0d61ec84  00004e20
0d61ec88  702018a8
0d61ec8c  00000000
0d61ec90  00000001
0d61ec94  7c822311 kernel32!SetEvent
0d61ec98  00000000
0d61ec9c  0d61ed40
0d61eca0  7a2fd1a0 mscorwks!NGenCreateNGenWorker+0xa2aa5
0d61eca4  00000000
0d61eca8  0d61ed4c
0d61ecac  7a006db1 mscorwks!GetCompileInfo+0x40e42
0d61ecb0  0000040c
0d61ecb4  00004e20
0d61ecb8  7020194c
0d61ecbc  00d79a84
0d61ecc0  00000000
0d61ecc4  00d70000
0d61ecc8  00000044
0d61eccc  00000000
0d61ecd0  00000000
0d61ecd4  00000000
0d61ecd8  00000000
0d61ecdc  00000000
FAULTING_THREAD:  00000748FOLLOWUP_IP: 
mscorwks!GetCompileInfo+4078f
7a0066fe 8bf0            mov     esi,eaxFOLLOWUP_NAME:  MachineOwnerMODULE_NAME: mscorwksIMAGE_NAME:  mscorwks.dllSYMBOL_NAME:  mscorwks!GetCompileInfo+4078fDEFAULT_BUCKET_ID:  WRONG_SYMBOLSBUCKET_ID:  WRONG_SYMBOLSFollowup: MachineOwner=================================================
如果解决了另开贴给分.
切望高手帮忙!!

解决方案 »

  1.   

    很可能是Com组件本身的问题,这个是无法避免的——使用第三方的东西。
    也可能是你调用模式有问题——你应该贴代码,而不是出错提示
      

  2.   

    如果确定是gc的问题
    对于非托管资源,可以在析构函数中释放

    ~YourClass()
    {
        UnMgnObjectDispose();
    }
    看看是否还会出错。
      

  3.   

    //动态加载
    string AssemblyFile=...
    Assembly ass = Assembly.LoadFile(AssemblyFile);
    Type type = ass.GetType(ClassName, false, true);
    ass.CreateInstance(type.FullName, true);
    //调用
    MethodInfo CallMethod = ..;//find method
    CallMethod.Invoke(..);//调用//在dispose的时候也调用了Marshal.ReleaseComObject(obj);关键现在是定位问题是.net的问题 还是COM的问题.
    如果是com的问题 那么大概是什么类的
    也好让 相关的人改.
      

  4.   

    ReleaseComObject和Access violation(av)错误
    ref:http://blogs.msdn.com/yvesdolc/archive/2004/04/17/115379.aspx
    可能是你释放的时候其他托管代码还具有它的引用
    ReleaseComObject的问题google下还有很多,还有的是nofix...
      

  5.   

    跟 ReleaseComObject 没有关系,因为在加这个之前也是有同样的问题。
      

  6.   

    为啥老说我代码乱呢?
    我没有写一行代码哎.
    是windbg输出的结果哦.
    难道csdn没有一个高手?