0

我有一个程序,它加载动态库LoadLibrary并使用FreeLibrary. 到目前为止,我已经使用_CrtDumpMemoryLeaks()execute on检查了内存泄漏DLL_PROCESS_DETACH。它有一个强制性缺陷——没有正确检查全局变量。原因是全局变量在DLL_PROCESS_DETACH信号后被销毁。为了解决这个问题,我_CrtDumpMemoryLeaks()用设置_CRTDBG_LEAK_CHECK_DF标志替换。

auto tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpDbgFlag);

但在此更改后,内部 crtdbg 函数进入无限递归,以stack overflow异常结束。

    stack overflow exception, after some cycles
    ...
    Library.dll!abort() Line 51 C++
    Library.dll!__acrt_getptd() Line 289    C++
    Library.dll!_LocaleUpdate::_LocaleUpdate(__crt_locale_pointers * const locale) Line 1698    C++
    Library.dll!common_vsprintf<__crt_stdio_output::format_validation_base,wchar_t>(const unsigned __int64 options, wchar_t * const buffer, const unsigned int buffer_count, const wchar_t * const format, __crt_locale_pointers * const locale, char * const arglist) Line 146 C++
    Library.dll!common_vsnprintf_s<wchar_t>(const unsigned __int64 options, wchar_t * const buffer, const unsigned int buffer_count, const unsigned int max_count, const wchar_t * const format, __crt_locale_pointers * const locale, char * const arglist) Line 334   C++
    Library.dll!__stdio_common_vsnwprintf_s(unsigned __int64 options, wchar_t * buffer, unsigned int buffer_count, unsigned int max_count, const wchar_t * format, __crt_locale_pointers * locale, char * arglist) Line 404 C++
    Library.dll!_VCrtDbgReportW(int nRptType, void * returnAddress, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, char * arglist) Line 518 C++
    Library.dll!_CrtDbgReportW(int report_type, const wchar_t * file_name, int line_number, const wchar_t * module_name, const wchar_t * format, ...) Line 278  C++
    Library.dll!issue_debug_notification(const wchar_t * const message) Line 25 C++
    Library.dll!__acrt_report_runtime_error(const wchar_t * message) Line 154   C++
    Library.dll!abort() Line 51 C++
    Library.dll!__acrt_getptd() Line 289    C++
    Library.dll!_LocaleUpdate::_LocaleUpdate(__crt_locale_pointers * const locale) Line 1698    C++
    Library.dll!common_vsprintf<__crt_stdio_output::format_validation_base,wchar_t>(const unsigned __int64 options, wchar_t * const buffer, const unsigned int buffer_count, const wchar_t * const format, __crt_locale_pointers * const locale, char * const arglist) Line 146 C++
    Library.dll!common_vsnprintf_s<wchar_t>(const unsigned __int64 options, wchar_t * const buffer, const unsigned int buffer_count, const unsigned int max_count, const wchar_t * const format, __crt_locale_pointers * const locale, char * const arglist) Line 334   C++
    Library.dll!__stdio_common_vsnwprintf_s(unsigned __int64 options, wchar_t * buffer, unsigned int buffer_count, unsigned int max_count, const wchar_t * format, __crt_locale_pointers * locale, char * arglist) Line 404 C++
    Library.dll!_VCrtDbgReportW(int nRptType, void * returnAddress, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, char * arglist) Line 518 C++
    Library.dll!_CrtDbgReportW(int report_type, const wchar_t * file_name, int line_number, const wchar_t * module_name, const wchar_t * format, ...) Line 278  C++
    Library.dll!issue_debug_notification(const wchar_t * const message) Line 25 C++
    Library.dll!__acrt_report_runtime_error(const wchar_t * message) Line 154   C++
    Library.dll!abort() Line 51 C++
    Library.dll!__acrt_getptd() Line 289    C++
    Library.dll!_LocaleUpdate::_LocaleUpdate(__crt_locale_pointers * const locale) Line 1698    C++
    Library.dll!common_vsprintf<__crt_stdio_output::format_validation_base,char>(const unsigned __int64 options, char * const buffer, const unsigned int buffer_count, const char * const format, __crt_locale_pointers * const locale, char * const arglist) Line 146  C++
    Library.dll!common_vsnprintf_s<char>(const unsigned __int64 options, char * const buffer, const unsigned int buffer_count, const unsigned int max_count, const char * const format, __crt_locale_pointers * const locale, char * const arglist) Line 334    C++
    Library.dll!__stdio_common_vsnprintf_s(unsigned __int64 options, char * buffer, unsigned int buffer_count, unsigned int max_count, const char * format, __crt_locale_pointers * locale, char * arglist) Line 391    C++
    Library.dll!_vsnprintf_s_l(char * const _Buffer, const unsigned int _BufferCount, const unsigned int _MaxCount, const char * const _Format, __crt_locale_pointers * const _Locale, char * _ArgList) Line 1585   C++
    Library.dll!_vsnprintf_s(char * const _Buffer, const unsigned int _BufferCount, const unsigned int _MaxCount, const char * const _Format, char * _ArgList) Line 1606    C++
    Library.dll!_VCrtDbgReportA(int nRptType, void * returnAddress, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 293  C++
    Library.dll!_CrtDbgReport(int report_type, const char * file_name, int line_number, const char * module_name, const char * format, ...) Line 263    C++
    Library.dll!_CrtDumpMemoryLeaks() Line 1720 C++
    Library.dll!report_memory_leaks(const bool __formal) Line 211   C++
    Library.dll!__acrt_execute_uninitializers(const __acrt_initializer * first, const __acrt_initializer * last) Line 63    C++
    Library.dll!__acrt_uninitialize(bool terminating) Line 310  C++

我查看了一些函数的内部,它看起来像内部的internal_getptd_noexit()返回,以( ) 结尾。返回的最内部函数是inside 。我不知道这是否与无限循环的原因有关-也许会有所帮助。nullptr__acrt_getptd()abort()per_thread_data.cppnullptr__acrt_FlsSetValue(__acrt_flsindex, reentrancy_sentinel)internal_get_ptd_head()

这种 crtdbg 行为的原因可能是什么?

4

0 回答 0