CrtDebug Stackoverflow?

Я получаю нарушение прав доступа, которое я не могу отладить.

Я, кажется, получаю какую-то рекурсивную ошибку внутри вызова CRT _CrtCheckMemory,

Ниже приведен стек вызовов (внизу -> вверху), где ... просто удалены повторные сообщения.

msvcr100d.dll!__chkstk()    Unknown
msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 252  C
msvcr100d.dll!_CrtDbgReportV(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 242   C
msvcr100d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 258   C
msvcr100d.dll!_CrtCheckMemory() Line 1817   C++
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 383 C++
msvcr100d.dll!_nh_malloc_dbg_impl(unsigned __int64 nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239  C++
msvcr100d.dll!_calloc_dbg_impl(unsigned __int64 nNum, unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 601  C++
msvcr100d.dll!_getptd_noexit() Line 470 C
msvcr100d.dll!_XcptFilter(unsigned long xcptnum, _EXCEPTION_POINTERS * pxcptinfoptrs) Line 202  C
msvcr100d.dll!_callthreadstartex$filt$0() Line 316  C
msvcr100d.dll!__C_specific_handler(_EXCEPTION_RECORD * ExceptionRecord, void * EstablisherFrame, _CONTEXT * ContextRecord, _DISPATCHER_CONTEXT * DispatcherContext) C
ntdll.dll!0000000077989d0d()    Unknown
ntdll.dll!00000000779791af()    Unknown
ntdll.dll!00000000779b1278()    Unknown
msvcr100d.dll!__chkstk()    Unknown
...
msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 298  C
msvcr100d.dll!_CrtDbgReportV(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 242   C
msvcr100d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 258   C
msvcr100d.dll!_CrtCheckMemory() Line 1817   C++
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 383 C++
msvcr100d.dll!_nh_malloc_dbg_impl(unsigned __int64 nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239  C++
msvcr100d.dll!_calloc_dbg_impl(unsigned __int64 nNum, unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 601  C++
msvcr100d.dll!_getptd_noexit() Line 470 C
msvcr100d.dll!_errno() Line 280 C
msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 298  C
msvcr100d.dll!_CrtDbgReportV(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 242   C
msvcr100d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 258   C
msvcr100d.dll!_CrtCheckMemory() Line 1817   C++
msvcr100d.dll!_free_dbg_nolock(void * pUserData, int nBlockUse) Line 1288   C++
msvcr100d.dll!_free_dbg(void * pUserData, int nBlockUse) Line 1265  C++
msvcr100d.dll!_freefls(void * data) Line 622    C
msvcr100d.dll!_freeptd(_tiddata * ptd) Line 683 C
msvcr100d.dll!_endthreadex(unsigned int retcode) Line 365   C
msvcr100d.dll!_callthreadstartex() Line 315 C
msvcr100d.dll!_threadstartex(void * ptd) Line 297   C
kernel32.dll!000000007729652d() Unknown
ntdll.dll!000000007798c521()    Unknown

Любая идея, что может быть причиной этого или совет о том, как я могу идти об отладке?

1

Решение

Ну, это немного трагично. Он пытается сгенерировать диагностику, чтобы сообщить вам, что куча повреждена. Код сообщения пытается получить значение ERRNO чтобы отобразить его, но это статическая переменная CRT, которая выделяется по требованию. Так он выделяет память. Который умирает, куча повреждена. Который вызывает диагностику, чтобы сказать вам, что куча повреждена. Остальное можно угадать, это продолжается и продолжается до тех пор, пока не выйдет из стека.

Один из обходных путей — добавить этот бит кода в начало main (или потока):

 int dummy = errno;

поэтому CRT выделяет память до того, как куча будет повреждена. Вам все равно придется найти причину коррупции.

4

Другие решения

На самом деле ваша основная проблема в том, что вы испортили свою память, и теперь, когда программа хочет выйти, она хочет освободить свою внутреннюю выделенную память (память, которая использовалась для хранения данных на поток), и, поскольку вы используете отладочную версию, она проверит свою память и понять сбой и начать показывать окно подтверждения, теперь, когда он хочет показать окно подтверждения, ему нужно выделить немного памяти и использовать подпрограммы выделения памяти (malloc ведьма будет преобразована в malloc_dbg в этом случае) выделить необходимую память и malloc_dbg проверьте состояние памяти и поймите ее повреждение и попробуйте снова показать окно подтверждения, и эта процедура будет повторена. пожалуйста, проверьте динамическое распределение памяти (и даже проверьте статически определенный массив для переопределения), чтобы решить проблему повреждения памяти, и переполнение стека будет решено автоматически

2

По вопросам рекламы [email protected]