2012-10-02 2 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 메모리 상태를 확인하고 메모리 손상을 이해하고 어설 션 창을 다시 표시하려고하면이 절차가 반복됩니다. 다이나믹 메모리 할당을 확인하고 (심지어 정적으로 정의 된 배열을 검사하여 오버라이드를 확인하십시오) 메모리 손상을 해결하고 스택 오버 플로우가 자동으로 해결됩니다.