IT/일반
Handle 누수 잡아내기
Taegony
2008. 12. 26. 17:53
최근 제품 기능 패치 후 부하테스트를 진행했다. 결과는 아래와 같이 나왔다.
위 그림에서 하얗게 나온 그래프가 핸들의 개수이다.
약 15시간 테스트를 진행했는데 핸들이 비정상적으로 증가했다.
메모리 누수되는 부분이 있는지만 확인하려다가 그냥 핸들수도 체크항목에 넣어본건데 당황스러운 결과가 나왔다. -_-;
다행히 메모리 누수는 없는 것으로 판단이 됐지만 핸들 누수는 조금 의외였다.
혹시 방법이 있을까 싶어서 이리저리 검색해보다가 WinDbg로 확인하는 방법을 알아냈다.
아래와 같은 순서로 진행했다.
1. WinDbg를 실행한다.
: 아래와 같이 실행할 파일을 선택한다.
2. 아래와 같이 선택한 프로그램이 실행되며 pause 상태로 초기화된다.
: !htrace -enable 명령을 입력하여 htrace를 활성화한다.
: 이 명령은 이후 핸들의 open/close 상태를 기록하도록 한다.
: 명령이 성공하면 아래와 같이 성공 메시지가 출력된다.
3. 현재 pause 상태이므로
g 명령을 입력하거나 메뉴에서 Degug > Go (F5)를 선택하여 프로그램을 진행시킨다.
4. 일정 시간동안 프로그램을 수행한 후
메뉴의 Debug > Break 를 선택하여 pause 상태로 만든다.
그리고나서 명령창에 !htrace 를 입력한다.
5. !htrace 를 입력하면 아래와 같이 핸들값들에 대한 open/close 로그가 출력된다
: Open/close 한 모듈과 함수명도 출력이 된다.
: 프로그램에 따라 상당히 많은 양이 출력된다.
6. !htrace 명령을 수행하면 로그가 나오긴 하는데 상당히 많은 로그가 출력된다.
글쎄 이걸 일일이 찾기는 좀 힘들어 보인다. 이 때는 !htrace -diff 명령을 수행한다.
: 이 명령은 open 후 close 되지 않은 핸들을 출력한다.
7. !htrace -diff 명령의 결과 아래와 같이 출력된다.
: CProcess::KillProcess 함수에서 open한 핸들이 close되지 않았음을 알 수 있다.
: Open 되었으나 close 되지 않은 핸들과 어느 모듈에서 호출했는지까지 보여준다.
주의할 점은 !htrace -enable 명령을 내린 시점부터 현시점까지
close되지 않았기 때문에 누수일 확률이 높다는 것이지 무조건 누수는 아니라는 것이다.
(당연한 얘기지만 ...^^;)
8. 진행조건
: WinDbg의 기본 환경은 미리 세팅한 상태이다. (File > Symbol File Path 항목)
: 테스트를 진행한 프로그램의 PDB 파일은 실행 파일과 같은 폴더에 위치해 있다.
: 만일 !htrace -diff 명령을 내려도 로그가 너무 많다면 일단 3번 항목을 수행하여
프로그램을 진행시킨다. 그 후 적절한 시점 (프로그램에 따라 개발자가 판단해야함)에
4번 항목을 수행하여 프로그램을 pause 시키고 2번 항목 (!htrace -enable)부터 수행한다.
WinDbg는 프로그램 비정상 종료시 Dr.Watson 로그를 분석할 때만 이용했는데 이런 기능도 있는지 미쳐몰랐다.
아무튼 이 놈때문에 쉽게 잡을 수 있어서 다행이다.