C++ CrtDebug堆栈溢出?

C++ CrtDebug堆栈溢出?,c++,c,visual-studio-2010,debugging,crt,C++,C,Visual Studio 2010,Debugging,Crt,我遇到访问冲突,我无法完全调试 我似乎在CRT调用\u CrtCheckMemory中遇到了某种递归错误 下面是调用堆栈(底部->顶部),其中,..只是删除重复消息 msvcr100d.dll!__chkstk() Unknown msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * ar

我遇到访问冲突,我无法完全调试

我似乎在CRT调用
\u 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

你知道是什么原因导致了这个问题,或者我可以建议你如何进行调试吗?

实际上,你的主要问题是你的内存已经损坏,现在当程序想退出时,它想释放内部分配的内存(用于存储每线程数据的内存),由于您使用的是调试版本,它将检查其内存并了解故障并开始显示断言窗口,现在当它想要显示其断言窗口时,它需要分配一些内存并使用内存分配例程(
malloc
在这种情况下,开关将转换为
malloc\u dbg
)要分配它所需的内存和malloc_dbg请检查内存状态并了解内存损坏情况,然后再次尝试显示断言窗口,此过程将重复。请检查动态内存分配(甚至检查静态定义的数组是否覆盖)以解决内存损坏问题,堆栈溢出将自动解决

实际上,您的主要问题是内存已损坏,现在当程序要退出时,它希望释放其内部分配的内存(用于存储每线程数据的内存),由于您使用的是调试版本,它将检查其内存并了解故障,并开始显示断言窗口,现在当它想要显示其断言窗口时,它需要分配一些内存并使用内存分配例程(
malloc
在这种情况下,该开关将转换为
malloc_dbg
)以分配其所需的内存和
malloc_dbg
检查内存状态并了解内存损坏情况,然后再次尝试显示断言窗口,此过程将重复。请检查您的动态内存分配(甚至检查静态定义的数组是否覆盖)要解决内存损坏和堆栈溢出问题,将自动解决。这有点悲惨。它正试图生成一个诊断来告诉您堆已损坏。报告代码试图获取errno的值以显示它,但这是一个静态CRT变量,可根据需要分配。因此它允许tes内存。如果内存已耗尽,则堆已损坏。这会触发一个诊断,告诉您堆已损坏。您可以猜测其余的,这会一直持续到堆用完为止

一种解决方法是将此代码位添加到main(或线程)的开头:


因此,CRT在堆损坏之前分配内存。您仍然需要找到损坏的原因。

这有点悲惨。它试图生成一个诊断来告诉您堆已损坏。报告代码试图获取errno的值以显示它,但这是一个静态CRT变量ets是按需分配的。因此它分配内存。如果内存耗尽,则堆已损坏。这会触发一个诊断,告诉您堆已损坏。您可以猜测其余部分,这会一直持续到堆用完为止

一种解决方法是将此代码位添加到main(或线程)的开头:


因此,CRT在堆损坏之前分配内存。您仍然需要找到损坏的原因。

我尝试运行appverifier并启用整页堆,这会破坏visual studio调试器的某些内容。但是,每当我遇到此特定崩溃时,它不会破坏任何内容(我发布的内容除外).Suggestions?调试器中断的“某些内容”可能是代码在分配后访问整页堆放置的无效页。我已尝试运行appverifier并启用整页堆,这会在某些内容上中断visual studio调试器。但是,每当我遇到此特定崩溃时,它不会中断任何内容建议?调试器破坏的“某些东西”可能是代码访问在分配后整个页面堆放置的无效页面。
 int dummy = errno;