다음을 통해 공유


이 메서드를 원격 디버깅과 결합

커널 디버거 사용자 모드 디버거를 제어하고 동시에 사용자 모드 디버거를 디버깅 서버 사용하는 것이 유용할 수 있습니다.

중요하다

원격 디버깅을 사용할 때 추가적인 중요한 보안 고려 사항이 있습니다. 보안 모드를 사용하도록 설정하는 방법에 대한 자세한 내용은 원격 디버깅 동안 보안 및 Windows 디버깅 도구대한 보안 고려 사항을 참조하세요.

예를 들어 이 구성은 사용자 모드 기호가 기호 서버에 있는 경우에 유용합니다. 커널 디버거에서 사용자 모드 디버거를 제어하기 위한 표준 구성에서 두 디버거의 상호 작용은 동기화에서 작은 경과로 이어질 수 있으며, 이러한 경과로 인해 기호 서버 인증을 방지할 수 있습니다. 여기에 설명된 더 복잡한 구성은 이 문제를 방지할 수 있습니다.

참고 이 시나리오를 설명하는 경우 대상 애플리케이션 디버그 중인 사용자 모드 애플리케이션을 참조하고, 대상 컴퓨터 대상 애플리케이션과 CDB 또는 NTSD 프로세스가 포함된 컴퓨터를 참조하고, 호스트 컴퓨터 커널 디버거가 포함된 컴퓨터를 참조합니다.

이 기술을 사용하려면 다음을 수행해야 합니다.

  1. 원하는 전송 옵션을 지정하여 -ddefer 및 -server 명령줄 옵션을 사용하여 대상 컴퓨터에서 NTSD 또는 CDB를 시작합니다. -server 옵션은 명령줄의 첫 번째 매개 변수여야 합니다.

    예를 들어 다음 구문을 사용하여 실행 중인 프로세스에 연결할 수 있습니다.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID 
    

    또는 다음 구문을 사용하여 새 프로세스를 대상으로 시작할 수 있습니다.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName 
    

    포스트모템 디버거로 설치하는 경우 다음 구문을 사용합니다. 레지스트리를 수동으로 편집하여 -server 매개 변수를 포함하는 사후 디버거를 설치해야 합니다. 자세한 내용은 사후 디버깅 활성화를 참조하세요.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] 
    

    사용 가능한 전송 옵션에 대한 자세한 내용은 디버깅 서버활성화를 참조하세요.

  2. 대상 컴퓨터를 디버그하려는 것처럼 호스트 컴퓨터에서 WinDbg 또는 KD를 시작하지만 실제로 대상 컴퓨터에 침입하지는 않습니다. WinDbg를 사용하려면 다음 구문을 사용합니다.

    windbg [-y KernelSymbolPath] [-k ConnectionOptions] 
    

    이 단계에 대한 자세한 내용은 WinDbg(클래식) 사용하여 Live Kernel-Mode 디버깅을 참조하세요.

    .

  3. 서버를 시작하는 데 사용되는 것과 동일한 전송 옵션을 사용하여 WinDbg 또는 CDB를 디버깅 클라이언트로 시작합니다. 이 디버깅 클라이언트는 호스트 컴퓨터 또는 세 번째 컴퓨터에서 실행할 수 있습니다.

    cdb -remote ClientTransport 
    

    이 단계에 대한 자세한 내용은 디버깅 클라이언트활성화를 참조하세요.

  4. 디버거가 실행되고 커널 디버거에 Input> 프롬프트가 나타나면 .sleep(디버거 일시 중지) 명령을 사용하여 디버거를 일시 중지하고 대상 컴퓨터를 몇 초 동안 실행하도록 합니다. 이렇게 하면 대상 컴퓨터에서 원격 전송 프로토콜을 처리하여 사용자 모드 원격 서버와 원격 클라이언트 간의 연결을 설정할 수 있습니다.

CDB를 사용자 모드 디버거로 사용하는 경우 디버깅이 계속되는 동안 CDB와 연결된 명령 프롬프트 창이 잠겨 있고 사용할 수 없습니다. NTSD를 사용하는 경우 NTSD에 대상 컴퓨터에 연결된 프로세스 ID가 있더라도 추가 창이 만들어지지 않습니다.

이 조합 시나리오에서는 4가지 모드와 토픽 전환 모드에 설명된 모드 간 전환 방법이 다음과 같은 차이점을 적용할 있습니다.

  • 두 가지 사용자 모드 디버깅 모드가 있습니다. 대상 컴퓨터가 실행 중일 때, 디버깅 서버는 다른 원격 디버깅 세션에서와 같이 디버깅 클라이언트에 의해 제어됩니다. 이를 원격 제어 사용자 모드 디버깅이라고 합니다. 커널 모드 디버거가 대상 컴퓨터에 연결되고 Input> 프롬프트가 표시되면 사용자 모드 디버거는 커널 디버거에 의해 제어됩니다. 이러한 상태를 커널 제어 사용자 모드 디버깅 라고 합니다.

  • 이러한 두 모드는 동시에 사용할 수 없습니다. 사용자 모드 디버거가 활성 상태일 수 있더라도 커널 디버거가 대상 컴퓨터에 연결되면 대상 컴퓨터가 원격 전송 프로토콜을 처리할 수 없으므로 사용자 모드 디버거는 이 연결을 통해 원격 입력을 받을 수 없습니다.

  • 사용자 모드 기호가 기호 서버에 있는 경우 원격 제어 사용자 모드 디버깅 모드에서 기호 액세스가 필요한 디버거 명령을 실행해야 합니다.

  • 커널 제어 사용자 모드 디버깅에서 원격 제어 사용자 모드 디버깅으로 전환하려면 .sleep(디버거 일시 중지) 명령을 사용합니다. 사용자 모드 디버거가 절전 명령에서 깨어나면 원격으로 제어되는 사용자 모드 디버깅 모드가 됩니다.

  • 원격 제어 사용자 모드 디버깅에서 커널 모드 디버깅으로 전환하려면 Input> 프롬프트에서 명령을 입력합니다. 이 프롬프트가 표시되지 않으면 커널 모드 디버깅으로 전환한 다음 kd> 프롬프트에서 g(Go) 명령을 사용합니다.

내부적으로, -ddefer으로 시작된 사용자 모드 디버거는 디버깅 클라이언트의 입력에 우선 순위를 첫 번째로, 커널 디버거의 입력에 두 번째로 부여합니다. 그러나 커널 디버거가 대상 컴퓨터에 연결되면 원격 연결을 사용할 수 없으므로 동시 입력 간에 충돌이 발생할 수 없습니다.