삽질하는플머

메모리 릭 체크하기

Lazarus

델파이의 빌드는 말 그대로 초스피드.
대부분의 델파이 프로그래머들은 이 엄청난 속도에 힘입어 코딩 후 즉각 실행시켜 확인하는 것이 습관처럼 되어있다. 게다가 FastMM이라는 걸출한 물건을 만난 이후부터는, 방금 만든 코드에 메모리 릭이 발생한다면 바로 바로 메시지를 띄워주기 때문에 별도의 프로파일러조차 필요없게 되었다.

그럼 라자루스는??

애석하게도 라자루스와 함께 사용할 메모리 릭 체커는 아직 찾지 못했다. 그러나 프리파스칼 컴파일러의 옵션에는 힙을 프로파일링하는 디버그옵션 "-gh"가 존재한다. 이 옵션을 잘 활용하면 FastMM만큼은 즉각적이지는 못해도 다른 도구의 도움 없이 흘린 메모리를 살펴볼 수 있게 된다.

먼저 fpc.cfg 파일을 열고 디버그 및 릴리즈 옵션을 다음과 같이 조절 한다.

#IFDEF RELEASE
  -O3
  -Xs
  -XX
#ENDIF

#IFDEF DEBUG
  -Crtoi
  -XS
  -glh
#ENDIF


-glh 는 줄단위 디버그정보와 위에서 언급한 힙 프로파일링 옵션을 켜 준다는 이야기이다. 나머지 옵션들은 fpc의 문서를 참조하자.

새 프로젝트를 생성하고 Project -> Compiler Options 메뉴에서 Other 페이지를 찾아가자.
여기에 컴파일러 지시자 -dDEBUG 를 다음과 같이 추가 해 준다.



(이렇게 개발중에는 컴파일러 지시자 -dDEBUG 를 주다가 실제 배포시에는 -dRELEASE 로 하는 것이 좋을 듯... )


프로파일된 결과물은 표준 출력으로 나오게 된다. 따라서 이 결과물을 보기 위해서는 실행파일이 콘솔을 가지고 있어야 한다. 메뉴에서 Project -> View Source 를 클릭해 *.lpr 제일 꼭대기에 다음과 같이 박아넣자.

{$ifdef DEBUG}
{$APPTYPE CONSOLE}
{$endif}


이제 프로젝트를 리빌드 한다. 한가지 문제가 있는데, 생성된 실행파일을 IDE에서 돌리는 것으로는 디버그 메시지가 표시되지 않는다는 것이다. 생성된 콘솔창이 프로그램 종료와 함께 닫혀버리기 때문이다. 따라서 커맨드 창을 띄우고 실행파일명을 직접 입력 해 주어야 한다.




프로그램을 종료하면 다음과 같이 사용된 메모리 정보가 표시된다.
뭐 아무짓도 안 했으니 메모리들이 모두 잘 반환되었다.



이제 Button1을 누를 때 마다 4바이트씩 메모리를 할당하도록 해 보자.

procedure TMainForm.Button1Click(Sender: PObj);
var
  i: PInteger;
begin
  New(i);
end;


버튼을 한 번 누르고 종료시킨 결과는 다음과 같다.




리소스릭이 발생한 유니트명과 함수명, 그리고 줄 번호까지 친절하게 표시 해 주고 있다. 만세~~!!


이 정보는 라자루스 포럼에 올라온 다음 두 개의 글타래를 종합한 것이다.

http://forum.lazarus.freepascal.org/index.php/topic,6121.0.html
http://forum.lazarus.freepascal.org/index.php/topic,5240.0.html