다음을 통해 공유


사용자 모드 디버거를 사용하여 디바이스 설치 디버깅

Windows Vista부터 PnP(플러그 앤 플레이) 관리자가 시스템에서 새 디바이스를 감지하면 운영 체제에서 디바이스 설치 호스트 프로세스(DrvInst.exe)를 시작하여 디바이스에 대한 드라이버를 검색하고 설치합니다.

사용자 모드 디바이스 설치 호스트 프로세스를 디버그하는 가장 효율적인 방법은 WinDbg 또는 Visual Studio와 같은 사용자 모드 디버거를 사용하는 것입니다. DrvInst.exe 프로세스는 일반적으로 사용자 상호 작용 없이 완료되므로 Microsoft는 디바이스 설치의 핵심 단계가 처리되기 전에 드라이버 패키지 개발자가 디버거를 연결할 수 있도록 Windows Vista 및 이후 버전의 Windows에 대한 지원을 추가했습니다.

사용자 모드 디버거 및 기타 디버깅 도구에 대한 자세한 내용은 Windows 디버깅을 참조하세요.

DebugInstall 레지스트리 값은 시스템에서 사용하도록 설정된 디바이스 설치 디버깅 지원 유형을 지정합니다. 이 레지스트리 값에 대한 자세한 내용은 디바이스 설치 디버깅 지원 설정을 참조하세요.

DebugInstall 레지스트리 값이 2로 설정되면 DrvInst.exe 설치를 계속하기 전에 사용자 모드 디버거가 해당 프로세스에 연결될 때까지 기다립니다. 디버거가 연결되면 프로세스가 디버거 자체에 침입합니다. 디버깅 중인 대상 시스템에서 자체 초기 중단점을 시작하지 않도록 디버거를 연결하고 구성해야 합니다.

예를 들어, 디버거를 이름으로 DrvInst.exe에 연결할 수 있습니다.

C:\>C:\Debuggers\WinDbg.exe -g -pn DrvInst.exe

또는 디버거가 대상 시스템에 연결된 경우 다음 디버그 정보가 표시됩니다.

DRVINST.EXE: Waiting for debugger on Process ID = 3556 ......

이렇게 하면 고유한 프로세스 ID를 사용하여 디버거를 DrvInst.exe 프로세스에 연결할 수 있습니다.

C:\>C:\Debuggers\WinDbg.exe -g -p 3556

사용자 모드 디버거가 DrvInst.exe 프로세스에 연결되면 디버거가 프로세스를 중단합니다.

Debugger detected!
DRVINST.EXE: Entering debugger during PnP device installation.
Device instance = "X\Y\Z" ...

(d48.5a0): Break instruction exception - code 80000003 (first chance)
eax=7ffde000 ebx=00000000 ecx=00000000 edx=77f745c0 esi=00000000 edi=00000000
eip=77f24584 esp=0105ff74 ebp=0105ffa0 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
77f24584 cc               int     3

0:000> |
.  0id: d48attachname: E:\Windows\system32\DrvInst.exe

디바이스 설치의 핵심 단계가 처리되지 않았기 때문에 디바이스에 사용되는 클래스 설치 관리자 또는 공동 설치 관리자 DLL은 아직 로드되지 않았습니다.

중단점에 대한 모듈 및 함수 이름을 미리 알고 있는 경우 "bu" 디버거 명령을 사용하여 해당 이름을 해결되지 않은 중단점으로 설정할 수 있습니다. 다음 코드 예제에서는 MyCoinst.dll 공동 설치 관리자의 주 진입점(CoInstallerProc)에 대해 해결되지 않은 중단점을 설정하는 방법을 보여 줍니다.

0:000> bu mycoinst!CoInstallerProc
0:000> bl
 0 eu             0001 (0001) (mycoinst!CoInstallerProc)

MyCoinst.dll 공동 설치 관리자가 로드되고 중단점에 도달하는 경우:

Breakpoint 0 hit
eax=00000001 ebx=00000000 ecx=00000152 edx=00000151 esi=01a57298 edi=00000002
eip=5bcf54f1 esp=0007e204 ebp=0007e580 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
mycoinst!CoInstallerProc:
5bcf54f1 8bff             mov edi,edi
0:000> bl
 0 e 5bcf54f1     0001 (0001)  0:**** mycoinst!CoInstallerProc

클래스 설치 관리자 또는 공동 설치 관리자 DLL은 각각 DrvInst.exe 프로세스에서 로드되거나 언로드되는 시기를 예측하지 않아야 합니다. 그러나 "bu"를 사용하여 설정된 중단점은 모듈이 언로드된 경우에도 유지됩니다.

또는 DrvInst.exe 프로세스는 해당 DLL의 부하 이벤트에 대한 디버거 예외를 설정하여 특정 클래스 설치 관리자 또는 공동 설치 관리자 DLL이 프로세스에 로드되는 지점까지 실행할 수 있습니다.

0:000> sxe ld mycoinst.dll

0:000> g

모듈이 로드되면 DLL 내에서 중단점을 설정할 수 있습니다. 다음은 그 예입니다.

ModLoad: 5bcf0000 5bd05000   C:\WINDOWS\system32\mycoinst.dll
eax=00000000 ebx=00000000 ecx=011b0000 edx=7c90eb94 esi=00000000 edi=00000000
eip=7c90eb94 esp=0007da54 ebp=0007db48 iopl=0         nv up ei ng nz ac po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000296
ntdll!KiFastSystemCallRet:
7c90eb94 c3               ret
0:000> .reload mycoinst.dll
0:000> x mycoinst!*InstallerProc*
5bcf54f1 mycoinst!CoInstallerProc (unsigned int, void *, struct _SP_DEVINFO_DATA *)

0:000> bu mycoinst!CoInstallerProc
0:000> bl
 0 e 3b0649d5     0001 (0001)  0:**** mycoinst!CoInstallerProc
0:000> sxd ld mycoinst.dll
0:000> g
Breakpoint 0 hit
eax=00000001 ebx=00000000 ecx=000001d4 edx=000001d3 esi=000bbac0 edi=00000002
eip=5bcf54f1 esp=0007e204 ebp=0007e580 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
mycoinst!CoInstallerProc:
5bcf54f1 8bff             mov edi,edi
0:000> 

중단점이 확인되지 않은 중단점(bu)으로 설정되었으므로 모듈이 언로드된 경우에도 설정된 상태로 유지됩니다.

설치 프로세스가 완료되는 기본 기간은 5분입니다. 지정된 기간 내에 프로세스가 완료되지 않은 경우 시스템은 프로세스가 중단(응답 중지)된 것으로 가정하고 설치 프로세스가 종료됩니다.

디바이스 설치 프로세스 중에 사용자 모드 디버거가 대상 시스템에 연결된 경우 시스템은 이 시간 제한 기간을 적용하지 않습니다. 이렇게 하면 드라이버 패키지 개발자가 설치 프로세스를 디버그하는 데 필요한 시간을 할애할 수 있습니다.