티스토리 뷰
간만에 글을 써보네요.
Debug 빌드에서는 오류나지만 Release 빌드에서는 정상이고, Debug 빌드도 오류 발생 시점이 다양합니다. 왜 이러죠?
보통, 힙 익셉션이 발생해서 입니다.
Critical error detected c0000374
힙이 깨졌다는 이야기인데요. Release 빌드에서는 힙 체크를 사용하지 않으니 정상으로 보이기도 합니다.
어쨌든 어떻게 해결하는가? 아래를 참조하니,
https://blogs.msdn.microsoft.com/webdav_101/2010/06/22/detecting-heap-corruption-using-gflags-and-dumps/
gflags 를 사용하랍니다. Windows Debugger(WDBG) 나 WDK(Windows Development Kit)에 포함된 파일입니다. 좀 크지만 힘들지만 받아두는 것이 좋습니다. 여튼... 다음과 같이 하랍니다.
gflags -p /enable <디버깅을 원하는 실행 파일 경로명> /full
이렇게하면 힙이 깨질 때에 바로 덤프를 띄우고 죽습니다.
위에 문서에는 친절하게
adplus -crash -p <프로세스 아이디>
라고 되어 있습니다. 프로세스 아이디(pid)는 모를 수도 있으니,
adplus -crash -pn <실행 파일명>
하면 되겠습니다만, 생성되는 덤프 파일(*.dmp)만 받아도 좋습니다.
다 확인하시고 나서는 돌려 놓아야 하겠지요?
gflags -p /disable<디버깅을 원하는 실행 파일 경로명>
덤프 파일을 VS IDE 에서 열어 보면 원인을 파악해 볼 수 있습니다.
단순하게 포인터를 잘못 사용한 예도 있고,
http://devhoma.tistory.com/13 (허락을 못 맡았네요.)
아래처럼 메모리 범위를 침범하는 경우도 있지만
http://blog.hani.co.kr/jeongmoonoh/102100 (허락을 못 맡았네요.)
후자에 해당하지만, 원인이 #define 을 잘못 설정해서 발생하는 경우도 있습니다. 예를 들면 라이브러리를 생성할 때와 실제 사용할 때에 구조를 다르게 잡아서 힙이 깨질 수 있습니다. 다음과 같은 코드를 썼다는 것이죠.
struct xxx {
#if defined(xxx_feature)
int x;
#endif
};
라이브러리를 빌드할 때에는 헤더에는 xxx_feature 를 define 하지 않았고, 소스에서는 define 하여 빌드하고,
라이브러리를 사용할 때에는 xxx_feature 를 define 한 상태로 빌드하는 경우입니다.