콘솔 응용 프로그램 (MS VS2010 SP1을 사용하여 작성 됨)이 있습니다. MFC가없고 ATL이 없으며 표준 라이브러리 만 있습니다. 디버그 빌드에서 모든 것이 정상적으로 작동합니다. 그러나 릴리스 빌드에는 액세스 위반이 있습니다. "Mapp.exe에서 0x77b0206e의 첫 번째 예외 : 0xC0000005 : 0x002cef58 위치를 읽는 액세스 위반입니다."mlock에서 액세스 위반이 있음
MS VS (짝수 릴리스 모드)에서 앱을 실행하면 모든 것이 정상적으로 작동하며 진행 상황을 알 수 없습니다. 나는 적시 (just-in-time) 디버깅을 사용하려고했는데 내가 호출 스택을받은 :
ntdll.dll!77b020cb()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
Mapp.exe!_unlock(int locknum=72090689) Line 375 C
04320069()
이 앱은 종료 및 오브젝트 파괴가 진행되면 무슨 일이 생긴
:의 원인이되는 'PTR 삭제'와 같은 한 줄이 예외. 하지만 여러 번 그 코드를 확인하고 아무것도 찾지 못했습니다. CRT 디버그 함수 (메모리 누수 진단, 사용자 지정 메모리 할당 후크 등) 및 결과가 사용하려고했습니다. 또한이 문제는 CRT의 디버그 버전 (릴리스 구성에서 다중 스레드 디버그 (/ MTd) 사용)을 사용할 때 해결됩니다. 한 가지 더 : 코드에 약간의 변경 (예 : 디버그 코드 줄 작성)을 수행하면 호출 스택이 완전히 달라질 때마다 변경됩니다. 예를 들면 :
ntdll.dll!77b0206e()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
Mapp.exe!_unlock_fhandle(int fh=72090689) Line 491 C
04320069()
을하고 다른
ntdll.dll!77b0206e()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77b0201f()
kernel32.dll!768cf1cc()
Mapp.exe!free(void * pBlock=0x024950f0) Line 51 C
Mapp.exe!CGISMapLineShape::~CGISMapLineShape() Line 20 + 0x13 bytes C++
Mapp.exe!CGISMapPolygonShape::`scalar deleting destructor'() + 0x13 bytes C++
Mapp.exe!CGISMapMultyPolygonShape::~CGISMapMultyPolygonShape() Line 9 C++
Mapp.exe!CGISMapMultyPolygonShape::`scalar deleting destructor'() + 0xc bytes C++
Mapp.exe!CGISMapShapeCollection::Clear() Line 307 C++
나는 fpplication 코드에서 몇 가지 버그가 있다는 것을 이해하지만 문제는 내가 그 질문 릴리스에서
코드를 보지 않고도 해결하는 것은 사실상 불가능합니다. 내가 너라면, 나는 초기화되지 않은 변수와 이중 삭제를 찾는 것으로 시작할 것이다. – molbdnilo
확실히 메모리가 어딘가에 덮어 씁니다. 당신은 신중하게 코드를 두 번 삭제 해 보거나, 할당 된 공간의 끝이나 맨 앞을 지나서 쓸 수 있습니다. 리눅스에서 valgrind를 통해 프로그램을 실행할 수도 있습니다. Windows 대안이 무엇인지 잘 모르겠습니다. – Torp