티스토리 뷰

간만에 글을 써보네요.

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 한 상태로 빌드하는 경우입니다.






댓글