在过程终止期间出现错误R6016

时间:2015-12-23 11:08:43

标签: c++ visual-studio-2010 msvcrt

当我们的应用程序即将终止时,我有一个非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

的ctr函数中的进程终止时重置

我认为crt过早关闭,在另一个使用它的DLL之前,但我不知道为什么。 我们的计划不会致电CreateThread

所以我的问题是:

  • 如何终止dll以及以何种顺序?它是确定性的还是从执行变为执行?
  • 我该如何进一步调查?

0 个答案:

没有答案