Сбой при закрытии приложения - проблема с atexit? - PullRequest
0 голосов
/ 08 марта 2012

один из наших процессов падает при завершении работы приложения. ErrorHandlingClient является DLL. Я вижу эту строку в аварийной копии:

"Деструктор динамического атаке для CErrorLog :: m_IErrorHandlingServerPtr"

Я также искал в переполнении стека 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 голосов
/ 14 июня 2012

Вы на самом деле не предоставили достаточно информации, но является ли это проблемой уничтожения COM-объекта после того, как COM был неинициализирован?

m_IErrorHandlingServerPtr, учитывая его странное имя, возможно, общий указатель COM, который уничтожается, когда последнийэкземпляр (удерживаемый как член вашего класса) выходит из области видимости, но для этого удаления COM должен быть еще жив.

Одним из возможных решений было бы обеспечение того, чтобы у вашего класса была собственная пара Initialize / Uninitialize, и этоможет быть получено из производного от базового класса, который инициализирует в своем конструкторе и деинициализирует в своем деструкторе.Вы можете использовать личное наследование для этого.Вы должны быть осторожны с различными моделями потоков.

Не уверен, почему это не приведет к сбою в старых средах, но они могли использовать COM для различных вещей в прошлом, которые теперь изменились, чтобы не использовать COM, и поэтомуCOM оказался живым.Кроме того, если это какой-то глобальный тип, их порядок уничтожения всегда будет недетерминированным, поэтому по сути это всегда было неопределенное поведение, но в прошлом наблюдалось «неопределенное» поведение, которое просто работало, а теперь нетт.

...