Windows Programming

#File Error#

오즈마스터 2008. 2. 12. 15:57

#File Error#


1.요약

프로그램이 끝날 때 메모리 릭이 난 부분은 가르쳐주는 거 아시죠?

근데 거기에 파일이름이 #File Error# 이라고 나오는 경우가 있습니다.


2.본문

우선은 누가 친절하게 메모리 릭을 잡아주느냐를 알아봐야겠죠.

CRT의 디버그 힙이 바로 그 일을 해줍니다.

즉 메모리 할당할 당시에 ( new, malloc 문장) 그 라인 번호와 파일 이름을 CRT 자체적으로 어딘가에 저장하고 있는데, 그곳이 망가져버리거나 쓸 수 없게 되어버리면 #File Error# 이라고 대신해서 나온답니다.

우선 망가지는 경우로는 누군가가 그곳을 overwrite 해버리는 경우가 있겠고, 정말 있어서는 안될 일이겠습니다.

다음으로 우리에게 일어날 수 있는 시나리오로, dll 에서 할당한 메모리를 제거하지 않은 경우.. 그런데 메모리 릭을 덤프하기 전에 그 dll을 unload 시켜벼린 경우.. 그 파일이름 정보를 찾아볼 수가 없다고 하는군요.

그러니까 우리가 가장 쉽게 접할 수 있는 예로는, COM 객체내에서 일이 있어서 할당한 메모리 블럭이 실수로 지워지지 않은 경우.. 그 메모리 릭의 여부는 표시되지만 파일의 위치는 알 수 없는겁니다.

일반적인 해결 방법은 모르겠고, 개인적으로 제안하고 싶은 방법은 다음과 같습니다.

일단 객체의 크기를 알고 있으면 메모리 릭된 크기를 보고 대충 짐작할 수 있겠죠.

혹은 클라이언트에서 객체의 무슨 기능을 사용하고 나니까 메모리 릭이 나더라.. 하는 정도는 찾아볼 수 있겠죠..

그러면 그 특정 기능을 수행한 후에 바로 다음 문장을 실행해 보는 겁니다.

_CrtMemDumpAllObjectsSince(0);
이 문장으로인해 여태까지 할당된( 그리고 해제되지 않은) 모든 객체가 덤프됩니다.

그리고 이 순간은 dll이 unload 되었을 리가 없으므로 파일이름도 올바르게 출력됩니다.

결국은 적당히 때려 맞추는 겁니다.


3.예제



4.참고

PRB: #File Error# During Dump of Heap Objects
ID: Q163370



- 2001.08.19 Smile Seo -

출처: www.debuglab.com
원문: http://www.debuglab.com/knowledge/fileerror.html