我有一个程序,它加载动态库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.cpp
nullptr
__acrt_FlsSetValue(__acrt_flsindex, reentrancy_sentinel)
internal_get_ptd_head()
这种 crtdbg 行为的原因可能是什么?