0
votes

Recently we are seeing a significant increase in crashes related to COM at our client sites after they upgraded to Windows Server 2008R2. Initially we thought it might be due to COM reference counting issue, but after further investigation going through the code, we have ruled it out. Another angle that we are looking at is, is it possible that the COM library is getting un-initialized due to which this issue might be occurring? Again we have ruled it out after investigating going through the code. As of now we do not have any concrete answers.

Is there any known instances of COM crashes increasing after migrating to 64bit?

Below are the crash fingerprints. I have kept it concise for this post.

Crash 1:

0:000> kpn 2

# ChildEBP RetAddr

00 0033e9d8 662051d5 pvformscom!ATL::CComPtrBase::~CComPtrBase(void)+0x6 [c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlcomcli.h @ 162]

01 0033ea00 66210586 pvformscom!COrder::~COrder(void)+0xa6 [c:\2012.01_svc_dep\cpp\pvformscom\order.cpp @ 149]

0:000> .frame 00

00 0033e9d8 662051d5 pvformscom!ATL::CComPtrBase::~CComPtrBase+0x6 [c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlcomcli.h @ 162]

0:000> dt this

Local var @ ecx Type ATL::CComPtrBase*

{ 00000001 } +0x000 p : 0x00000001 ICalendar

Crash 2:

0:000> kpn 2

# ChildEBP RetAddr

00 0016e6d8 646052a9 pvformscom!ATL::CComPtrBase::~CComPtrBase(void)+0x6 [c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlcomcli.h @ 162]

01 0016e700 646106ae pvformscom!COrder::~COrder(void)+0x6f [c:\2012.01_svc_dep\cpp\pvformscom\order.cpp @ 152]

0:000> .frame 00

00 0016e6d8 646052a9 pvformscom!ATL::CComPtrBase::~CComPtrBase+0x6 [c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlcomcli.h @ 162]

0:000> dt this

Local var @ ecx Type ATL::CComPtrBase*

{ 00000001 } +0x000 p : 0x00000001 IImmunization

Crash 3:

0:000> kpn 2

# ChildEBP RetAddr

00 0032f008 6193f444 pvformscom!ATL::CComPtrBase::~CComPtrBase(void)+0x6 [c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlcomcli.h @ 162]

01 0032f038 6194d2a7 pvformscom!CClinicalEvent::~CClinicalEvent(void)+0x2df [c:\2012.01_svc_dep\cpp\pvformscom\clinicalevent.cpp @ 170]

0:000> .frame 00

00 0032f008 6193f444 pvformscom!ATL::CComPtrBase::~CComPtrBase+0x6 [c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\atlcomcli.h @ 162]

0:000> dt this

Local var @ ecx Type ATL::CComPtrBase*

{ 00000001 } +0x000 p : 0x00000001 IPVCollection

Any help is highly appreciated.

NOTE: We are using some smartpointers in our class as member varibale.

Thanks,

Sree

1
The problem is with inner COM pointers you have wrapped in template class. There is something you are doing wrong with them.Roman R.
Hi Roman, Anyway its a com pointer so how it will create problem. Could you please clarify more?Sree
COM pointer (managed by instance of smart template) is eventually released with IUnknown::Release call. At the moment of the call the pointer is either invalid or the call takes place on wrong thread. Hence the problem, and the problem with ~CComPtrBase on call stack.Roman R.

1 Answers

2
votes

If you call Release() after ::CoUninitialize() that would be a reason for this behavior.