라이브 로컬 디버깅

Microsoft Windows XP 이상 운영 체제에서는 -kl 명령줄 옵션으로 KD(커널 디버거) 또는 WinDbg를 시작하여 로컬 커널 디버깅을 수행할 수 있습니다.

kd [-y SymbolPath] -kl 

또는

windbg [-y SymbolPath] -kl 

Windows Vista 이상에서는 로컬 커널 디버깅을 사용하려면 /debug 옵션을 사용하여 컴퓨터를 부팅해야 합니다. 관리자 권한으로 명령 프롬프트 창을 열고 bcdedit /debug를 입력합니다. 컴퓨터를 다시 부팅합니다.

중요

BCDEdit를 사용하여 부팅 정보를 변경하기 전에 테스트 PC에서 BitLocker 및 보안 부팅과 같은 Windows 보안 기능을 일시적으로 일시 중단해야 할 수 있습니다. 테스트가 완료되면 이러한 보안 기능을 다시 사용하도록 설정하고 보안 기능이 비활성화된 경우 테스트 PC를 적절하게 관리합니다.

Windows Vista 이상에서는 로컬 커널 디버깅을 수행하려면 디버거를 관리자 권한으로 실행해야 합니다.

라이브 로컬 디버깅은 디버거가 연결될 때 재현하기 어려운 문제를 디버깅하는 데 매우 유용합니다. 그러나 패킷, IRP 및 SRB 데이터를 비롯한 시간에 중요한 정보에 대한 지식이 필요한 모든 항목은 문제가 중단 또는 중단되지 않는 한 작동하지 않을 수 있습니다.

로컬 디버깅을 수행할 때 다음 변수를 고려합니다.

  • 전체 상태. 예를 들어 스트림이 실행되고 있나요? 스트림이 일시 중지되어 있나요?

  • 패킷 개수입니다. 예를 들어 스트림에 대기 중인 IRP가 있나요?

  • 패킷 수의 변경 내용입니다. 스트림이 이동 중입니까?

  • 패킷 목록의 변경 내용입니다.

  • 커널 스레드가 중단되었습니다.

이 중 마지막을 고려합니다.

LKD에서 중단된 스레드 검사

먼저 !process 0 0 확장을 사용하여 중단된 스레드를 포함하는 프로세스를 식별합니다. 그런 다음, 해당 스레드에 대한 자세한 내용을 보려면 !process 를 다시 실행합니다.

lkd> !process 816a550 7
        THREAD 81705da8  Cid 0b5c.0b60  Teb: 7ffde000 Win32Thread: e1b2d890 WAIT: (Suspended)
        IRP List:
            816c9ad8: (0006,0190) Flags: 00000030  Mdl: 00000000
        Start Address kernel32!BaseProcessStartThunk (0x77e5c650)
        Win32 Start Address 0x0101c9be
        Stack Init f50bf000 Current f50bea74 Base f50bf000 Limit f50b9000 Call 0
        Priority 10 BasePriority 8 PriorityDecrement 0

스레드는 표시되지 않지만 스택 주소는 표시됩니다. 스택의 현재 주소에서 dds (또는 ddq) 명령을 사용하면 호출하는 프로세스를 지정하기 때문에 추가 조사를 위한 시작점이 생성됩니다.

lkd> dds f50bea74
f50bea74  f50bebc4
f50bea78  00000000
f50bea7c  80805795 nt!KiSwapContext+0x25
f50beab4  8080ece0 nt!KeWaitForSingleObject
f50beabc  f942afda ks!CKsQueue::CancelAllIrps+0x14
f50bead8  f94406c4 ks!CKsQueue::SetDeviceState+0x170
f50beb00  f943f6f1 ks!CKsPipeSection::DistributeDeviceStateChange+0x1d
f50beb24  f943fb1e ks!CKsPipeSection::SetDeviceState+0xb2