当我们的应用程序即将终止时,我有一个非sistematic崩溃(R6016)。 该应用程序由几个DLL组成。
经过一番调查后,我们在mscvrt(VS 2010)的函数中发现了问题:
_ptiddata __cdecl _getptd_noexit (
void
)
{
_ptiddata ptd;
DWORD TL_LastError;
TL_LastError = GetLastError();
#ifdef _M_IX86
/*
* Initialize FlsGetValue function pointer in TLS by calling __set_flsgetvalue()
*/
if ( (ptd = (__set_flsgetvalue())(__flsindex)) == NULL ) {
#else /* _M_IX86 */
if ( (ptd = FLS_GETVALUE(__flsindex)) == NULL ) {
#endif /* _M_IX86 */
/*
* no per-thread data structure for this thread. try to create
* one.
*/
#ifdef _DEBUG
extern void * __cdecl _calloc_dbg_impl(size_t, size_t, int, const char *, int, int *);
if ((ptd = _calloc_dbg_impl(1, sizeof(struct _tiddata), _CRT_BLOCK, __FILE__, __LINE__, NULL)) != NULL) {
#else /* _DEBUG */
if ((ptd = _calloc_crt(1, sizeof(struct _tiddata))) != NULL) {
#endif /* _DEBUG */
if (FLS_SETVALUE(__flsindex, (LPVOID)ptd) ) {
/*
* Initialize of per-thread data
*/
_initptd(ptd,NULL);
ptd->_tid = GetCurrentThreadId();
ptd->_thandle = (uintptr_t)(-1);
}
else {
/*
* Return NULL to indicate failure
*/
_free_crt(ptd);
ptd = NULL;
}
}
}
SetLastError(TL_LastError);
return(ptd);
}
在过程关闭期间正常调用此函数,通常它可以正常工作。 当它不起作用时,它返回NULL;分析代码的失败点是:
calloc_crt
返回NULL,即无法分配内存FLS_SETVALUE
返回0 FLS_SETVALUE是一个调用FlsSetValue
的宏。它接收一个全局var,__ flsindex,它是光纤的索引
已分配FlsAlloc
。
__flsindex在_mtterm
我认为crt过早关闭,在另一个使用它的DLL之前,但我不知道为什么。
我们的计划不会致电CreateThread
。
所以我的问题是: