시스템 파티션의 남은 공간이 물리적 메모리 크기보다 작은 상황에서 메모리 덤프가 페이징 파일이 있는 곳과 다른 볼륨에 메모리 덤프가 생성되는 과정에 대해서 아래와 같이 테스트를 진행하였습니다.


[환경]
Windows Server 2008 SP2
Physical Memory : 512MB
Pagefile.sys : 560MB


[테스트 절차]
1. 현재 pagefile.sys 의 크기가 563,200KB 인 것을 확인 (설정된 Max 값)



2. C Drive 의 남은 공간은 335MB, D Drive 는 전체 메모리 덤프가 생성될 수 있도록 563MB 이상의 남은 공간 확인
(C Drive 에 Memory.dmp 가 생성될 공간이 부족해서 사전에 덤프 저장 경로를 다른 볼륨으로 지정해 놓은 상황 재현)



3. 덤프 생성 위치 D Drive, 전체 메모리 덤프(1) 유형 확인

C:\> wmic recoveros get DebugFilePath, DebugInfoType





4. bang.exe 툴을 사용하여 crash 발생 후 메모리 덤프 생성

5. C Drive 의 남은 공간이 41MB 인 상황에서 위 테스트를 한 번 더 진행해 봅니다.


[테스트 결과]
1. C Drive 남은 공간이 335MB 그리고 41MB 가 남아 있는 두 번의 상황 모두 Crash 덤프는 정상적으로 D Drive 에 생성 되었습니다.

2. 메모리 덤프가 정상적으로 생성이 되면 Pagefile.sys 의 크기는 덤프를 생성하기 전에 C Drive 에 남아 있는 공간 크기로 최대 크기가 설정됩니다. 즉, 두 번째 테스트 상황이라면 pagefile.sys 의 최대 크기는 약 41MB 가 되며, C Drive 의 전체 남은 공간은 약 512MB 로 설정되게 됩니다. 만약 이 상황에서 다시 한 번 Crash Dump 를 수집한다면 pagefile.sys 의 크기가 Physical Memory 크기보다 작으므로 정상적인 덤프 생성은 불가능하게 됩니다. 이 상황에서 시스템을 재시작하면 원래대로 pagefile.sys 의 최대 크기가 560MB 로 조정되어 부팅되게 됩니다.

이 테스트에서 Pagefile.sys 의 최대 크기가 변경되는 과정은 Crash dump file 생성 프로세스를 확인하면 이해할 수 있습니다.

1. 부팅 진행 과정에서 Session Manager(SSMS)가 Page file 을 다시 초기화 할 때, SmpCheckForChrashDump 함수를 호출하여 부트 볼륨의 현재 Page file 파일을 확인하여 crash dump 가 있는지 확인합니다.

2. 위 상황과 같이 다른 볼륨(D Drive)에 덤프를 생성하도록 지정된 경우 Paging file 이름을 Dumpxxx.tmp 같은 임시 파일명으로 변경합니다.

3. 부팅 과정에서  신규 생성되는 pagefile.sys 크기를 덤프 데이터 크기로 조정한 뒤 해당 파일을 truncate 해야 하는데 Dumpxxx.tmp 파일에 의해 C Drive 에 남은 공간이 부족하여 최초 설정한 최대 크기(560MB)만큼 생성될 수 없게 됩니다. (그래서 위와 같이 pagefile.sys 파일 크기가 약 41MB 크기로 작게 생성되게 됩니다)
만약 덤프가 pagefile.sys 와 같은 볼륨에 있었다면 임시 덤프 파일은 사용하지 않고 파일 이름을 바로 변경합니다.

4. 마지막으로 Wininit 는 MachineCrash Key 를 체크하여 값이 존재할 경우 WerFault 를 실행하여 Dumpxxx.tmp 파일을 Memory.dmp 파일로 복사합니다.


추가적으로 Windows Server 2008 에서 사용할 수 있는 Dedicated dump 는 적용하지 않은 환경입니다.


[참고자료]
Windows Internals 5th


작성자 : Lai Go / 작성일자 : 2011.05.18

Posted by Lai Go