我们的一个进程在关闭应用程序期间崩溃。 ErrorHandlingClient是一个dll。我在崩溃转储中看到了这一行:
“`CErrorLog :: m_IErrorHandlingServerPtr的动态atexit析构函数”
我在堆栈溢出中搜索了msdn;我无法得到明确的答案。我们的应用程序移植到vc 9.0编译器。对于早期版本,此问题不会发生。我正在粘贴崩溃堆。
0018fcf4 76c28681 ole32!CStdIdentity::~CStdIdentity+0x8c
0018fcf8 00000002
0018fcfc 0081aa38
0018fd00 0081a990
0018fd04 693bbf14 ErrorHandlingClient!__native_startup_lock
0018fd08 007a1890
0018fd0c 0018fd18
0018fd10 76c285eb ole32!CStdIdentity::`scalar deleting destructor'+0xd
0018fd14 0081a990
0018fd18 0018fd2c
0018fd1c 76c2882a ole32!CStdIdentity::CInternalUnk::Release+0x6e
0018fd20 00000001
0018fd24 005c037c
0018fd28 737d3607 msvcr90!_decode_pointer
0018fd2c 0018fd38
0018fd30 76d3b6b9 ole32!IUnknown_Release_Proxy+0x11
0018fd34 80000000
0018fd38 0018fd60
0018fd3c 693a8421 ErrorHandlingClient!`dynamic atexit destructor for 'CErrorLog::m_IErrorHandlingServerPtr''+0x11
0018fd40 0081c9ec
0018fd44 693a462f ErrorHandlingClient!_CRT_INIT+0x1be [f:\dd\vctools\crt_bld\self_x86\crt\src\crtdll.c @ 449]
0018fd48 693a8410 ErrorHandlingClient!`dynamic atexit destructor for 'CErrorLog::m_IErrorHandlingServerPtr''
0018fd4c 00000001
0018fd50 00000000
0018fd54 69390000 ErrorHandlingClient!Define_the_symbol__ATL_MIXED::Thank_you::Thank_you <PERF> (ErrorHandlingClient+0x0)
0018fd58 693a8410 ErrorHandlingClient!`dynamic atexit destructor for 'CErrorLog::m_IErrorHandlingServerPtr''
0018fd5c 00000000
0018fd60 0018fda4
0018fd64 693a474e ErrorHandlingClient!__DllMainCRTStartup+0xb7 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtdll.c @ 560]
答案 0 :(得分:0)
您还没有真正提供足够的信息,但这是COM未被初始化后COM对象被销毁的问题吗?
m_IErrorHandlingServerPtr给出它的奇怪名称可能是一个COM共享指针,它在最后一个实例(作为你的类的成员保存)超出范围时销毁,但它仍然需要COM才能执行此删除。
一种可能的解决方案是确保您的类具有自己的Initialize / Uninitialize对,这可以通过从在其构造函数中执行初始化并在其析构函数中取消初始化的基类派生来实现。您可以使用私有继承。您必须小心不同的线程模型。
不确定为什么它不会在旧环境中崩溃,但是他们可能已经使用COM来处理过去的各种事情,现在已经改为不使用COM,因此COM碰巧还活着。此外,如果这是某种全局性的,它们的破坏顺序总是不确定的,所以基本上这将始终是未定义的行为,但在过去观察到的“未定义”行为是它刚刚起作用,现在它没有吨。