2013. 1. 8. 17:54

problem of memory leak detect( malloc )

http://www.nynaeve.net/?p=209

위 내용 처럼 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를 사용하지 않는다고 명시 되어 있다.

2011. 3. 30. 13:24

debug diagnostic

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은 그다지 시간 소요가 없다.

  1. 해당 process 선택 하고 context menu 에서 Monitor For Leaks를 선택한다.( 특정 dll을 해당 process로 inject 을 한다.)

     
 2. memory leak 일 발생되는 동작을 반복한다.
 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 으로 이동한다.  
Available Analysis Scripts 에서 Memory Pressure Analyzers 를 선택한다.
하단의 Add Data Files 버튼을 클릭하여 아까 생성한 dump 파일을 선택한다.
Start Analysis 버튼을 클릭하면 결과 보고서가 생성된다.


 
2010. 4. 5. 17:05

Detect Resoruce Leak

  • 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