윈도우 7 메모리 덤프 생성 과정 변경

안녕하세요? Sankim입니다, 오늘은 제목이 좀 건조 합니다.

이번 포스팅에서는 Windows 7에서 변경된 메모리 덤프(Memory dump) 생성 프로세스에 대해서 말씀 드릴까 합니다. 다 읽으시고 나서는 Windows 7을 기점으로 지금까지 생각지도 못한 세밀한 부분들까지 새로운 PC환경을 위해 능동적으로 변화하고 있다고 느끼(?) 실지도 모르겠습니다.

clip_image002

[블루스크린] 블루스크린이 왜 파란색인지 궁금하시면 여기를 클릭하세요.

Windows 사용자라면 애석하게도 블루스크린을 한번씩 경험해 보셨을 거라 믿습니다. 블루 스크린이란 윈도우의 커널 모드에서 문제(Crash)가 발생하면 화면상에 Crash가 발생했음을 알리는 블루스크린을 띄우면서 시스템 드라이브(보통 C 드라이브 루트 폴더)에 있는 페이지파일(pagefile.sys) 파일에 메모리 내용을 쓰게 됩니다, 그 뒤에 부팅하면서 덤프가 저장된 이전 pagefile.sys로 C:\Windows 폴더에 메모리 덤프 파일인 memory.dmp를 생성합니다. Dump(덤프)라는 의미가 어떤 매체의 데이타를 다른 종류의 매체로 옮긴다는 의미를 가지고 있는데, 블루스크린이 발생하면 숫자가 1%에서 100%까지 옮겨 가는 것을 볼 수 있죠? 이것이 바로 메모리에 있는 데이터를 하드디스크에 있는 Pagefile.sys에 옮기는 과정을 나타내는 것 입니다.

image

[메모리에서 Memory.dmp로 가는 과정]

윈도우에서 어떤 작업을 하기 위해서는 실행 데이터가 메모리에 올라와 있어야 하는데 이 때문에 memory.dmp에는 당시 윈도우가 문제 시점에 어떤 일들이 벌어 지고 있는지를 확인할 수 있는 아주 중요한 단서를 가지고 있습니다. 그래서 이 memory.dmp 파일을 분석하여 문제(Crash)가 발생한 원인을 찾아 해결 합니다.

clip_image004

[WinDBG를 이용해 디버깅 중(?)..]

덤프에는 메모리에 있던 모든 내용을 모두 dump하는 전체덤프(Complete dump), 메모리에서 커널(Kernel) 관련 내용만 dump하는 커널덤프(Kernel dump)가 있고 덤프에 대한 간략한 정보만을 담은 작은 메모리 덤프(Mini dump)가 있습니다. 만약 메모리가 2GB를 넘어가면 아래 그림에서처럼 전체덤프 옵션을 사라지고 커널덤프와 미니덤프만 남습니다, 그러나 사용자가 필요하다면 레지스트리 변경으로 전체덤프 생성이 가능합니다. 시스템 Crash(블루스크린이 나타난 경우 보통 이렇게 부릅니다)이 발생한 경우 대부분 커널덤프로 분석하지만(당연히 Kernel에서 문제니까) 경우에 따라서 Application Mode가 커널모드(Kernel Mode)에 영향을 주어 시스템 Crash를 야기하는 경우가 있어 드물지만 전체 덤프가 필요한 경우가 있습니다. 몇 년 전만해도 대용량의 전체덤프가 필요할 때 때 이것을 어떻게 받아내서(마치 산고를 거쳐 한 생명을 받아내듯이..) 그걸 어떻게 원격에 가져가 분석할지에 대해서 고민한적이 있었는데요.. **요즘이야 워낙 하드디스크가 커져서리..

image

[디버깅 정보 쓰기] ‘덤프 유형 확인은 제어판 > 시스템 > 고급 시스템 설정 > 시작 및 복구’에서 확인 가능합니다.

덤프의 유형이 ‘전체 덤프’로 설정 되어 있으면 ‘실제 페이지 파일(Pagefile.sys) 크기 + 300MB’의 크기의 memory.dmp 파일이 생성 되는데. 요즘 대부분의 PC나 노트북의 경우 2GB 정도의 메모리가 기본으로 장착 되어 있기 때문에 2GB의 메모리가 있다면 2.3GB 정도의 memory.dmp 파일이 생성 됩니다, 혹은 커널 덤프라고 해도 수백 메가바이트가 되기도 합니다. 아무리 요즘 하드디스크가 대용량화 되었다고 해도 이런 크기는 무시 못할 것입니다, 게다가 넷북과 같은 경우 PC만큼 넉넉한(?) 용량을 가지고 있지 못하기 때문에 큰 부담이 될 수 있습니다. 이에 Windows 7에서부터는 하드디스크에서 부담을 줄이고자 메모리 전체 덤프와 커널덤프 파일 생성 여부를 아래와 같이 변경 하였습니다.

image

[메모리 덤프 생성 여부 순서도]

*Update, 종전에 “4GB이하”라는 항목에서 “25GB”라고 그림이 바뀌어있습니다. 4GB제한일 때는 Windows 7 Beta 시절이고 현재 RTM의 경우는 25GB가 맞습니다. 이를 콕집어 확인해주신 talee군에게 감사 드립니다.

결론부터 말씀 드리면 위 순서도의 결론은 25GB 이상의 여유 공간이 존재 하지 않는 한 메모리 덤프를 생성하지 않는다는 것입니다. 이것은 하드디스크의 공간이 충분하지 않은 상태에 Memory.dmp 파일이 생성되어 시스템 리소스를 차지 하는 것을 막겠다는 의도 입니다. 위 표를 정리 해보죠.

① 먼저 레지스트리 AlwaysKeepMemorydump값이 1로 되어 있으면 무조건 메모리 덤프 파일을 생성합니다. 아래 덤프를 만들기 위한 조건에 관계하지 않고 무조건 메모리 덤프를 생성 합니다. 경로는 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl 입니다, 기본적으로는 없는 값이므로 필요하면 만드셔야 합니다.

② 만약 Windows가 Windows Server 2008 R2 이상이면 무조건 메모리 덤프 파일을 생성합니다. 기업에서 서버로 사용하는 제품에 문제가 생겼는데 덤프 분석이 필요할 가능성이 높겠죠? 그래서 더 볼 것 없이 W2K8 R2에서는 무조건 덤프를 생성 합니다. 이전에 말씀 드렸듯이 Windows 7과 Windows Server 2008 R2는 동일한 커널을 가지고 있으며 이번에 새로 적용된 룰은 이 둘에게만 해당 됩니다.

③ 만약 Windows 7 이상 클라이언트가 도메인에 Join 되어 있다면 무조건 메모리 덤프 파일을 생성한다. 도메인에 Join되어 있다는 의미는 기업 고객일 가능성이 높고, 고객 기업이라면 덤프 발생시 클라이언트라도 덤프 분석이 필요한 가능성이 높기 때문입니다.

④ 도메인에 조인 되어 있지 않다면 하드디스크의 여유 공간이25GB 이상인지 확인 한다, 만약 25GB 이상이면 메모리 덤프 파일을 생성 하지만, 그렇지 않다면 생성하지 않습니다.

자~ 그럼 전체덤프와 커널덤프 말고 미니덤프(Minidump)는 어떨까요? 이전에는 시스템 Crash가발생할 때마다 Minidump폴더(보통 C:\Windows\Minidump)에 MiniMMDDYY-nn.dmp 파일(MMDDYY는 월/일/연도) 이름 형식으로 미니덤프가 쌓였었습니다, 미니덤프와 다른 덤프의 차이점은 크기가 작다는 점 이외에 다른 전체/커널덤프들은 만약 덤프가 발생하면 이전에 있던 memory.dmp위에 덮어 씁므로써(Overwrite) 복수의 덤프 파일이 생성되지 않지만 미니 덤프파일의 경우 계속해서 발생일 표시인 MMDDYY과 뒤에 nn의 이름을 바꿔가며 생성됩니다. 그래서 Windows 7에서 부터는 레지스트리 MinidumpsCount 값으로 최대로 만들어 질 수 있는 미니덤프 값을 조정 할 수 게 되었습니다. MinidumpsCount는 레지스트리 경로 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl에서 볼 수 있으며 기본 50개로 설정 되어 있습니다.

Windows 7에서는 지금까지 말씀 드린 덤프 파일과 같이 디스크 크기(Disk Footprint)를 줄이기 위한 노력 이외에도 정말 여러 방면에서 OS를 가볍게 해서 빠른 Performance를 내기 위한 눈물겨운(?) 노력을 기울였는데요, 앞으로 계속해서 소개하도록 하겠습니다.

** 생각해 보니 HDD는 커졌지만 메모리도 너무 많이 커져서.. 램이 512GB인데 이걸 전체 덤프로 받으려면..