CComPtrBase::~解除分配智能指针时,CComPtr Base崩溃

CComPtrBase::~CComPtrBase is crashing while deallocating smart pointers

本文关键字:CComPtr 崩溃 Base 指针 解除分配 智能 CComPtrBase      更新时间:2023-10-16

最近,在我们的客户端站点升级到Windows Server 2008R2后,与COM相关的崩溃显著增加。最初我们认为这可能是由于COM引用计数问题,但经过对代码的进一步调查,我们已经排除了这种可能性。我们正在关注的另一个角度是,COM库是否可能因未初始化而发生此问题?在对代码进行调查后,我们再次排除了这种可能性。到目前为止,我们还没有任何具体的答案。

迁移到64位后,是否有COM崩溃增加的已知实例?

以下是碰撞指纹。我在这篇文章中简明扼要。

崩溃1:

0:000>kpn 2

#ChildEBP RetAddr

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

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

0:000>.帧00

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

0:000>dt此

本地var@ecx类型ATL::CComPtrBase*

{0000000 1}+0x000 p:0x00000001 ICalendar

崩溃2:

0:000>kpn 2

#ChildEBP RetAddr

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

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

0:000>.帧00

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

0:000>dt此

本地var@ecx类型ATL::CComPtrBase*

{0000000 1}+0x000 p:0x00000001 II通信

崩溃3:

0:000>kpn 2

#ChildEBP RetAddr

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

01 0032f038 6194d2a7 pvformscom!c临床事件::~ c临床事件(无效)+0x2df[c:\2012.01_svc_dep\cpp\pvformscom\clinicalevent.cpp@170]

0:000>.帧00

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

0:000>dt此

本地var@ecx类型ATL::CComPtrBase*

{0000000 1}+0x000 p:0x00000001 IPV集合

非常感谢您的帮助。

注意:我们在类中使用一些智能指针作为成员变量。

谢谢,

Sree

如果在::CoUninitialize()之后调用Release()这种行为。