류짱:Beyond MySelf

특정 Service가 시작되지 않을 경우, 사용자 모드 덤프 수집 및 디버깅 방법 본문

Microsoft/Windows Platform

특정 Service가 시작되지 않을 경우, 사용자 모드 덤프 수집 및 디버깅 방법

リュちゃん 2010. 11. 5. 10:42

특정 Service가 시작되지 않을 경우, 사용자 모드 덤프 수집 및 디버깅 방법

참고
How to debug Windows services (Windows 서비스를 디버깅하는 방법)

http://support.microsoft.com/?id=824344

아래 내용은 WinDBG Debugger(windbg.exe)를 이용하여, Windows Service를 어떻게 Debug 하는지에 대한 설명입니다. rshsvc.exe 서비스에 대한 사용자 덤프 수집 방법을 예로 설명합니다.

Windows에서 Service를 Debug하기 위해서는 windbg.exe를 이용하여, 이미 Start 된 상태의 Process를 Attach하는 방법(일반적인 방법)과 Service 가 시작되지 않는 문제를 확인하기 위해, Service 에 시작 명령이 가해짐과 동시에 windbg.exe를 Attach, 같이 구동하는 방법이 있습니다. 여기서는 후자를 설명합니다.

시작하기 전에 아래 URL 에서 Debugging Tools for Windows(WinDBG) 툴을 다운로드 받고, 문제의 서비스가 있는 시스템에 설치합니다. 물론 운영체제의 환경에 맞게 x86 또는 IA64 등을 확인하여 맞는 버전을 선택하셔야 합니다.
http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx
WinDBG가 설치(C:\Program Files\Debugging Tools for Windows)되었다면, 아래의 Step을 차례대로 이행합니다.

Image File Execution 옵션의 구성

레지스트리 편집기(regedit.exe)를 실행하고, 아래 레지스트리 위치로 이동합니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Image File Execution Options 키에서 오른쪽 마우스 > 새로 만들기 > 키를 선택합니다.

새로 생성할 키의 이름에 Image name을 입력합니다. 여기서는 실제 문제의 서비스인 rshsvc.exe를 입력합니다.
생성된 rshsvc.exe 키에 오른쪽 마우스 > 새로 만들기 > 문자열 값을 선택하고, 값을 "Debugger"로 입력합니다. 그리고 값에는 "C:\Program Files\Debugging Tools for Windows\windbg.exe"를 입력합니다. (첨부 그림 참조)

화면에 WinDBG 창이 나타나도록 하기 위한 설정
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rshsvc 의 기본은 아래 그림과 같습니다.

 위 그림에서 Type 의 Data 값을 0x00000100로 변경합니다.
해당 값을 더블 클릭한 후 아래 그림과 같이 입력 후 확인합니다.

최종적으로 아래 그림과 같은 지 확인합니다.

서비스 시작에 필요한 대기 시간 편집
서비스가 시작되면, 서비스는 Service Control Manager 와 시작 시에 필요한 시간에 대해 확인을 받습니다. 만약 Service Control Manager가 구동되는 서비스로부터 "Service started" 메시지를 받지 못한다면, Service Control Manager 는 해당 서비스를 Terminate 시키게 됩니다. 일반적으로 이에 소요되는 시간은 약 30초 보다 짧습니다. 만약 해당 서비스의 시작 시간이 이 이상을 필요로 할 경우 아래의 방법을 통해 Service Control Manager 의 동작을 무시할 수 있습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
위 레지스트리 키에서 오른쪽 마우스 > 새로 만들기 > DWORD 값을 선택하고, ServicesPipeTimeout 라는 이름으로 값을 생성합니다. 아래 첨부된 그림과 같습니다.

이후 Data 값을 아래 그림과 같이 1일이라는 시간으로 충분히 적용합니다.

Note TimeoutPeriod is a placeholder for the value of the time-out period (in milliseconds) that you want to set for the service. For example, if you want to set the time-out period to 24 hours (86400000 milliseconds), type 86400000.
이후 Services.msc 를 통해 Remote Shell Service를 오른쪽 마우스 > Start 합니다.
그러면, WinDBG 프로그램이 자동으로 구동됩니다. (아래 Dialogue를 포함)

여기서 No를 선택하면, 명령 창이 하나 나타나고, WinDBG에 코드가 Display 됩니다.
이때 명령 창에 g 를 입력하고, 엔터를 칩니다.
이후 문제가 발생(에러 메시지 발생)한 후 WinDBG 에서 아래의 명령을 통해 사용자 Dump를 수집합니다.

.dump /ma c:\rshsvc.dmp

C:\ 에 rshsvc.dmp 가 생성되었음을 확인합니다.