류짱:Beyond MySelf

NotMyFault를 이용한 풀 메모리 Leak 발생 테스트 본문

Microsoft/Windows Platform

NotMyFault를 이용한 풀 메모리 Leak 발생 테스트

リュちゃん 2012. 2. 13. 15:11

NotMyFault를 이용한 풀 메모리 Leak 발생 테스트와 windbg를 이용해서 Local kernel debugging 으로 pool memory를 사용하는 tag 들을 확인 해 보도록 하겠습니다.

[준비 사항]
Windows debugging 툴과 Notmyfault를 다운로드 후 설치 합니다.

가. Debugging Tools for Windows
http://msdn.microsoft.com/en-us/windows/hardware/gg463009
Windbg 설치 방법은 생략 합니다. 서버 버전에 맞는 파일을 다운로드 후 설치 하시기 바랍니다.

나. NotMyFault
http://download.sysinternals.com/Files/Notmyfault.zip
저는 편의상 해당 파일 다운 로드 후 바탕 화면에 압축을 풀었습니다.

다. nonpaged pool 메모리 릭 발생 전 작업 관리자에서 확인한 커널 리소스
paged pool: 18M
Nonpaged pool: 12M

[NotMyFault를 이용한 풀 메모리 Leak 발생 테스트 및 Windbg를 통한 확인]
1. 준비 사항 '가'에서 다운 받은 Debugging Tool을 설치 합니다. => 설치 방법은 생략...
2. 바탕 화면\sysinternals\Notmyfault\exe\Release폴더로 이동하여 NotMyfault.exe 실행 합니다.
3. Nonpaged Pool Memory Leak을 발생 시키기 위해 Leak Nonpaged 를 클릭 합니다.  



* 1M 단위로 Nonpaged pool의 Leak이 발생합니다. 작업 관리자에서 Nonpaged pool의 사용량이 증가 하는 것을 확인 할 수 있습니다.


Nonpaged pool의 크기가 120M 정도까지 증가 하면 Stop nonpaged 를 클릭하여 Leak 발생을 중지 합니다.




4. 이제 windbg를 이용해서 Local kernel debugging을 시작 합니다. Windbg 실행과 심볼 fix 방법은 아래 포스팅을 참고 하시시기 바랍니다..
Windows server 2003 커널 리소스(Nonpaged pool, Paged pool) 최대 값 확인
http://ryuchan.kr/87

5. Windbg 화면에서 아래의 명령어를 실행 합니다

lkd> .symfix c:\symbols //C:\symbols 폴더로 심볼 경로를 지정합니다.
lkd> .reload    // 심볼을 리로드 합니다.
Connected to Windows Server 2003 3790 x86 compatible target at (Fri Feb 17 22:00:28.240 2012 (GMT+9)), ptr64 FALSE
Loading Kernel Symbols
...............................................................
...................................
Loading User Symbols
..........................................................
Loading unloaded module list


lkd> !vm 1                                                                 // 시스템의 Virtual Memory 상태를 확인 합니다.

*** Virtual Memory Usage ***
 Physical Memory:      262004 (   1048016 Kb)
 Page File: \??\C:\pagefile.sys
   Current:   1572864 Kb  Free Space:   1557856 Kb
   Minimum:   1572864 Kb  Maximum:      3145728 Kb
 Available Pages:      191765 (    767060 Kb)
 ResAvail Pages:       199425 (    797700 Kb)
 Locked IO Pages:         359 (      1436 Kb)
 Free System PTEs:      76854 (    307416 Kb)
 Free NP PTEs:          20766 (     83064 Kb)
 Free Special NP:           0 (         0 Kb)
 Modified Pages:          152 (       608 Kb)
 Modified PF Pages:       157 (       628 Kb)
 NonPagedPool Usage:    30894 (    123576 Kb)                     // Nonpaged pool이 약 123 사용중임을 확인
 NonPagedPool Max:      51960 (    207840 Kb)                     // Nonpaged pool 최대 값
 PagedPool 0 Usage:      2953 (     11812 Kb)
 PagedPool 1 Usage:       770 (      3080 Kb)
 PagedPool 2 Usage:       760 (      3040 Kb)
 PagedPool Usage:        4483 (     17932 Kb)
 PagedPool Maximum:     43008 (    172032 Kb)
 Session Commit:          211 (       844 Kb)
 Shared Commit:          2761 (     11044 Kb)
 Special Pool:              0 (         0 Kb)
 Shared Process:         2690 (     10760 Kb)
 PagedPool Commit:       4491 (     17964 Kb)
 Driver Commit:          1221 (      4884 Kb)
 Committed pages:       52346 (    209384 Kb)
 Commit limit:         632268 (   2529072 Kb)


lkd> !poolused /t5 2                                    //nonpaged pool을 가장 많이 사용하는 top5 를 리스트
   Sorting by  NonPaged Pool Consumed

  Pool Used:
            NonPaged            Paged
 Tag    Allocs     Used    Allocs     Used
 Leak      111 113664000         0        0 UNKNOWN pooltag 'Leak', please update pooltag.txt
 LSwi        1  2576384         0        0 initial work context
 nVsC        7  1445440         0        0 UNKNOWN pooltag 'nVsC', please update pooltag.txt
 TCPt       27  1422016         0        0 TCP/IP network protocol , Binary: TCP
 RaRS     1000   720000         0        0 RaidUnitAllocateResources , Binary: storport.sys
 TOTAL       29794 126262872     36446 17757664

6. Leak 이라는 pool tag가 약 110 M 이상의 Nonpaged pool을 사용하고 있음을 확인 할 수 있습니다.

7. 실제 그럼 Leak이라는 Pooltag를 어떤 드라이버가 사용을 하는지 확인을 하기 위해 명령프롬프틍서  아래와 같은 명령어를 입력 합니다. 

 C:\WINDOWS\system32\drivers>findstr /m /l Leak *.sys
myfault.sys

8. Memory Leak 테스트를 위해 실행 한  NotMyFault 프로그램의 시스템 드라이버인  myfault.sys 라는 시스템 드라이버가 많은 메모리를 사용 함을 확인 할 수 있습니다.

감사합니다.