2012-10-02 66 views
1

我得到一個訪問衝突我不能完全調試。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 

任何想法可能會導致這種情況或建議我可能會去調試嗎?

回答

4

嗯,這是一個有點悲壯。它試圖生成一個診斷,告訴你堆已損壞。報告代碼嘗試獲取errno的值以顯示它,但這是一個靜態CRT變量,可根據需要進行分配。所以它分配內存。哪個死了,堆被損壞了。這會觸發診斷程序告訴您堆已損壞。你可以猜測其餘的,這一直持續下去,直到它用完了。

一個解決方法是這個代碼位添加到主要的開始(或線程):

int dummy = errno; 

因此堆被損壞之前的CRT中分配內存。你仍然必須找到腐敗的原因。

+0

我試着運行AppVerifier的和使整頁堆,這打破一些東西,Visual Studio調試器。然而,每當我得到這個特定的崩潰,它不會中斷任何事情(除了我發佈的內容)。建議? – ronag

+0

調試器突破的「某些東西」可能是代碼訪問分配後整頁堆所放置的無效頁面。 –

2

其實你的主要問題是你有損壞你的記憶,現在當程序要退出,它要釋放其內部分配的內存(內存使用的每個線程的數據存儲),由於使用的是調試版本,它會檢查它的記憶和理解失敗,開始出現一個斷言窗口,現在當它想表明自己的說法窗口它需要分配一些內存和使用的內存分配例程(malloc女巫會在這種情況下,被轉換爲malloc_dbg)來分配其需要的內存和malloc_dbg檢查內存狀態,並瞭解你的內存損壞,並嘗試再次顯示斷言窗口,這個過程將被重複。請檢查您的動態內存分配(甚至檢查覆蓋靜態定義的數組)爲您解決內存損壞和堆棧溢出都將迎刃而解自動