'leak'에 해당되는 글 3건
- 2013.01.08 problem of memory leak detect( malloc )
- 2011.03.30 debug diagnostic
- 2010.04.05 Detect Resoruce Leak
problem of memory leak detect( malloc )
2013. 1. 8. 17:54 in link/debug

위 내용 처럼 malloc 은 특정 버젼의 Windows OS에서는 FPO(frame pointer omission) 이 되어 있어서 해당 memory leak 에 대한 call stack 을 얻기가 어려운 점 이 있다.
http://support.microsoft.com/kb/268343/en-us
위 url 에서 windows 2003 sp 이후 부터 malloc의 FPO를 사용하지 않는다고 명시 되어 있다.
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en
위 링크에서 download 받을 수 있다.
골치 아픈 memory leak 문제가 있었는데, 여러가지 tool 을 사용해 보았다.
하지만 딱히 hint 를 얻지 못한 상태에서 위 tool을 사용하였는데 해결의 실마리를 얻었다.
비단 memory leak 뿐 아니라 postmortem debugging 등 다양한 기능을 제공한다.
detect memory leak
Leakdiag 와 비교 시 장점은 Report 하는 데이터가 많으며 속도가 빠르다. 특히 LeakDiag는 symbol을 callstack에 매칭하는 작업이 엄청 시간이 걸리는데 반해 이 tool은 그다지 시간 소요가 없다.
3. 작업이 완료 되면 해당 process를 선택하고 context menu 에서 Create Fumm Userdump 를 선택하여 dump 파일을 생성한다.
4. symbol 위치를 설정한다. Tools -> Options And Settings... (기본적으로 ms symbol 은 설정되는 것 같다. 해당 software의 symbol을 Symbol Search Path For Analysis 에 추가하면 된다.
5. Advanced Analysis Tab 으로 이동한다.
위 링크에서 download 받을 수 있다.
골치 아픈 memory leak 문제가 있었는데, 여러가지 tool 을 사용해 보았다.
하지만 딱히 hint 를 얻지 못한 상태에서 위 tool을 사용하였는데 해결의 실마리를 얻었다.
비단 memory leak 뿐 아니라 postmortem debugging 등 다양한 기능을 제공한다.
detect memory leak
Leakdiag 와 비교 시 장점은 Report 하는 데이터가 많으며 속도가 빠르다. 특히 LeakDiag는 symbol을 callstack에 매칭하는 작업이 엄청 시간이 걸리는데 반해 이 tool은 그다지 시간 소요가 없다.
- 해당 process 선택 하고 context menu 에서 Monitor For Leaks를 선택한다.( 특정 dll을 해당 process로 inject 을 한다.)
3. 작업이 완료 되면 해당 process를 선택하고 context menu 에서 Create Fumm Userdump 를 선택하여 dump 파일을 생성한다.
4. symbol 위치를 설정한다. Tools -> Options And Settings... (기본적으로 ms symbol 은 설정되는 것 같다. 해당 software의 symbol을 Symbol Search Path For Analysis 에 추가하면 된다.
Available Analysis Scripts 에서 Memory Pressure Analyzers 를 선택한다.
하단의 Add Data Files 버튼을 클릭하여 아까 생성한 dump 파일을 선택한다.
Start Analysis 버튼을 클릭하면 결과 보고서가 생성된다.
하단의 Add Data Files 버튼을 클릭하여 아까 생성한 dump 파일을 선택한다.
Start Analysis 버튼을 클릭하면 결과 보고서가 생성된다.
- Handle leak
- Process Explorer
- Process Explorer 은 특정 process에서 사용 중인 handle의 목록을 보여주며, status bar에 전체 handle의 개수를 나타내에 준다.( status bar에서 오른쪽 버튼 클릭 -> Select Status Bar Column -> Check Number of Handles )
- handle의 증가 추세와 어떤 handle이 원인 인지를 대략적으로 확인이 가능하다.
- !htrace extension
- windbg의 extension 명령으로 handle을 trace 하는 기능을 수행한다.
- 명령어
- !htrace -enable
- handle trace를 활성화 시킨다.
- 현재의 handle trace의 snapshot을 생성한다.
- !htrace - diff
- 기존의 snapshot과 현재 상태를 비교하여 OPEN - CLOSE 쌍이 맞지 않는 목록을 보여준다.
- 사용 방법
- !htrace -enable -> !htrace => OPEN , CLOSE 의 모든 과정을 화면에 보여줌.
- !htrace -enalbe -> !htrace -diff => OPEN, CLOSE 가 맞지 않는 handle trace만 화면에 보여줌.
- 유의 사항
- 다른 process에 의해서 injected 된 handle인 경우 stack trace가 inject 한 process 것이 나타나기 때문에 stack주소와 symbol이 잘못 표기된다. 이 경우 source process를 디버깅해서 해당 stack 주소를 이용하여 stack trace를 찾아낼수 있다.(ln 명령어 이용)
- Memory leak
- UMDH
- 사용방법
- gflag 의 stack backtrace를 활성화 시킨다.(100M는 임의로 정한 값이다)
- symbol 설정을 한다. 환경변수에 _NT_SYMBOL_PATH 추가 하고 symsrv*symsrv.dll*d:\localsymbols*http://msdl.microsoft.com/download/symbols
- tlist 를 이용하여 해당 process의 pid를 얻어낸다.
- umdh -p:pid > firstsnap.txt
- 프로그램 작업 수행
- umdh -p:pid > secondsnap.txt
- umdh firstsnap.txt secondsnap.txt -f:result.txt
- result.txt 를 확인한다.
- + 12d38 ( 12d38 - 0) 1b allocs BackTrace3462E88 : 메모리 사용량
- + 1b ( 1b - 0) BackTrace3462E88 allocations 할당 회수
- ntdll!RtlAllocateHeap+00000274 stack trace
- stack trace로 문제 지점을 확인한다.
- 유의 사항
- Vista 이상인 경우 해당 process가 관리자 level인 경우 umdh도 관리자 level로 실행시켜야 한다.
- BSTR 은 메모리 할당의 성능 향상을 위하여 cache 정책을 수행하며 이 경우 umdh는 정상적인 BSTR 메모리 할당도 누수라고 보고한다. 이것을 막기 위하여 환경변수를 설정(OANOCACHE=1)하면 cache가 off 된다.
- MSDN document
- LeakDiag
- CRT Debug Function
- Visual Leak Detector
- Memory Leak Detection Using Windbg
- Memory Leak Detection in MFC
- Common WinDbg Commands (Thematically Grouped)
- C/C++ Memory Corruption And Memory Leaks
- The Memory Management Reference
- Using LeakDiag to Debug Unmanaged Memory Leaks
- Heap: Pleasures and Pains