应用程序关闭时崩溃 - atexit问题?

时间:2012-03-08 05:13:45

标签: visual-c++ visual-studio-2008 crash-dumps atexit

我们的一个进程在关闭应用程序期间崩溃。 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]

1 个答案:

答案 0 :(得分:0)

您还没有真正提供足够的信息,但这是COM未被初始化后COM对象被销毁的问题吗?

m_IErrorHandlingServerPtr给出它的奇怪名称可能是一个COM共享指针,它在最后一个实例(作为你的类的成员保存)超出范围时销毁,但它仍然需要COM才能执行此删除。

一种可能的解决方案是确保您的类具有自己的Initialize / Uninitialize对,这可以通过从在其构造函数中执行初始化并在其析构函数中取消初始化的基类派生来实现。您可以使用私有继承。您必须小心不同的线程模型。

不确定为什么它不会在旧环境中崩溃,但是他们可能已经使用COM来处理过去的各种事情,现在已经改为不使用COM,因此COM碰巧还活着。此外,如果这是某种全局性的,它们的破坏顺序总是不确定的,所以基本上这将始终是未定义的行为,但在过去观察到的“未定义”行为是它刚刚起作用,现在它没有吨。