EXDI 디버거 전송 구성
이 항목에서는 EXDI를 사용하여 커널 모드 디버깅을 설정하는 방법을 설명합니다. EXDI(확장 디버깅 인터페이스)는 소프트웨어 디버거와 디버깅 대상 간의 적응 계층입니다.
Windows용 디버깅 도구는 Windows 버전 22000부터 EXDI를 사용하여 커널 디버깅을 지원합니다.
EXDI를 구성하는 사용자 인터페이스는 버전 1.2410.11001.0부터 디버거에서 사용할 수 있습니다.
EXDI를 사용하여 QEMU 가상 환경과의 연결을 설정할 수 있습니다. 자세한 내용은 EXDI를 사용하여 QEMU 커널 모드 디버깅 설정을 참조하세요.
참고 항목
EXDI는 특정 환경에 대한 고급 특수한 형태의 디버깅입니다. 표준 KDNET 연결을 사용하는 것이 더 쉽게 구성할 수 있으며 권장됩니다. 네트워크 디버깅을 자동으로 설정하려면 KDNET 네트워크 커널 디버깅 자동 설정을 참조 하세요.
EXDI COM 서버 개요
EXDI는 하드웨어 디버거(예: JTAG 기반 또는 GdbServer 기반)에 대한 지원을 추가하여 WinDbg를 확장하는 인터페이스입니다. 아래 다이어그램은 EXDI-GdbServer의 역할을 보여 줍니다.
COM 서버는 COM 인터페이스를 구현하는 이진 구성 요소를 나타냅니다. 이 경우 windows 디버거 프로토콜 클라이언트에 대해 ExdiGdbSrv.dll 구현된 exdi3.idl입니다.
ExdiGdbsrv.dll 자체는 GDB 서버 쪽(또는 GDB 서버 스텁이라고도 함)이 QEMU GDB 서버(또는 Trace32/OpenOCD/UEFI GDB 서버 스텁 등)에 의해 구현되는 GDB-RSP 프로토콜의 클라이언트 쪽을 구현합니다.
EXDI 연결은 대상 PC에 로드되는 Windows 또는 Windows 디버깅 KDNET 프로토콜에 종속되지 않습니다. 이러한 소프트웨어 디버거 구성 요소는 필요하지 않으므로 EXDI는 초기 디바이스를 불러오고 OS 시작 문제를 디버깅할 때 유용할 수 있습니다.
Important
EXDI는 KDNET 프로토콜을 사용하지 않으므로 연결된 디버거는 PC에서 실행되는 작업에 대한 정보가 훨씬 적으며 많은 명령이 다르게 작동하거나 전혀 작동하지 않을 수 있습니다. 디버깅 중인 코드에 대한 프라이빗 기호에 액세스하면 디버거가 대상 시스템 코드 실행을 더 잘 이해할 수 있습니다. 자세한 내용은 공용 및 개인 기호를 참조 하세요.
EXDI 커널 모드 디바이스 요구 사항
디버거를 실행하는 컴퓨터를 호스트 컴퓨터라고 하며 디버깅 중인 컴퓨터를 대상 컴퓨터라고 합니다.
다음이 필요합니다.
대상 및 호스트 컴퓨터에서 QEMU와 같은 원하는 환경에서 지원되는 네트워크 카드입니다.
TCP/IP를 사용하여 대상과 호스트 간의 네트워크 연결입니다.
Windows 10 또는 Windows 11 버전 22000 이상
제한 사항
위에서 설명한 것처럼 EXDI는 KDNET 프로토콜을 사용하지 않으므로 연결된 디버거는 대상 시스템에 대한 정보가 적고 디버거 사용은 다릅니다. 대상 코드에 대한 프라이빗 기호에 액세스하지 않으면 대상 시스템의 상태를 이해하기 위해 기호를 사용하는 많은 명령이 작동하지 않습니다. 이 경우 메모리를 보고 콘텐츠를 등록하고 코드를 디스어셈블할 수 있습니다. 코드를 실행하거나 다른 일반적인 디버거 작업을 수행하는 위치를 결정하는 것은 프라이빗 기호 없이 매우 어렵고 시간이 많이 걸릴 수 있습니다.
동시 EXDI 및 KDNET 디버깅
일부 복잡한 시나리오에서 예를 들어 초기 디바이스를 불러올 때 대상 디바이스에 두 개의 연결을 갖는 것이 유용할 수 있습니다. EXDI 1개와 KDNET 1개. 대상이 Windows OS인 경우 KDNET 소프트웨어 디버깅은 일반적으로 가상 머신에 연결하는 것과 같이 구성됩니다. 이 설정에서는 두 개의 동시 디버거 중 하나가 중단되어 대상 컴퓨터의 코드를 디버그할 수 있습니다.
프로세스 서버의 WinDbg
이진 EXDI 구성 요소는 Windbg 프로세스에서 또는 Windbg 프로세스 내에서 실행할 수 있습니다. EXDI UI를 사용하거나 Inproc=<EXDI COM server binary>
COM 시작 오류를 줄여 안정성을 크게 향상시킵니다. 따라서 UI를 사용할 때 항상 사용하도록 설정되는 Inproc 매개 변수를 사용하여 EXDI 세션을 실행하는 것이 좋습니다.
명령줄 시작의 경우 기본 옵션은 처리되지 않지만 매개 변수를 사용하여 InProc=ExdiGdbDrv.dll
인프로세스를 사용하도록 설정해야 합니다.
COM GDB 서버 클라이언트
이 항목에서는 EXDI COM 디버거 인터페이스를 구현하는 EXDI COM GDB 서버 클라이언트(ExdiGdbSrv.dll)의 사용에 대해 설명합니다. 동일한 COM 인터페이스를 사용하여 JTAG-DCI용 EXDI COM 서버와 같은 다른 인터페이스를 구현할 수 있습니다.
EXDI 연결을 사용하는 프로세스 요약
이 프로세스를 사용하여 WinDbg와 EXDI 연결을 사용합니다.
- 호스트 시스템에 Windows 디버깅 도구를 다운로드하여 설치합니다.
- UI 또는 -kx 옵션을 사용하여 WinDbg를 시작하여 EXDI 서버에 연결합니다.
- WinDbg를 사용하여 사용 가능한 디버거 명령의 하위 집합을 사용하여 대상 시스템을 디버그합니다.
예제 EXDI 사용 시나리오는 EXDI를 사용하여 QEMU 커널 모드 디버깅 설정을 참조하세요.
Windows 디버깅 도구 다운로드 및 설치
호스트 시스템에 Windows 디버깅 도구를 설치합니다. 디버거 도구 다운로드 및 설치에 대한 자세한 내용은 Windows용 디버깅 도구를 참조 하세요.
WinDbg를 시작하고 EXDI 서버에 연결
EXDI 커널 연결 UI에서 다음 옵션을 구성할 수 있습니다.
대상 유형
[Trace32|BMC-OpenOCD|QEMU|VMWare|UEFI]
디버그하려는 대상 유형에 따라 선택합니다. 사용할 수 있는 대상 유형은 다음과 같습니다.- Trace32 : Lauterbach Trace32 HW 디버거 GDB 서버 구성
- BMC-OpenOCD: BMC-OpenOCD HW 디버거 GDB 서버 구성
- QEMU : QEMU SW 시뮬레이터 GDB 서버 구성
- VMWare: VMWare GDB 서버 구성
- UEFI: UEFI 펌웨어 디버깅
대상 아키텍처
[x86 | ARM64 | x64]
- 대상 프로세서 아키텍처입니다. 모든 대상 형식은 모든 대상 아키텍처를 지원하지 않을 수 있습니다.대상 OS
[Windows|Linux]
- 디버그하려는 대상 OS에 따라 선택합니다.이미지 스캔 추론 크기
[None | 0xFE - PreNT |0xFFE - NT]
- 이미지 스캔을 위한 추론 크기를 결정하려면 세 가지 옵션 중 하나를 선택합니다. 이 값은 디버거 엔진이 코드 검색 상태를 수집하는 데 사용되는 PE DOS 서명을 찾는 메모리를 검색하는 방법을 구성합니다. 특성 값 이 지정되지 않은 경우(또는 "0") 디버거 엔진은 빠른 추론을 사용하지 않고 PE DOS 서명을 찾는 전체 메모리를 검사하는 레거시 추론으로 대체됩니다. 각 대상 유형에 대해 기본값이 선택되며 권장됩니다.Gdb 서버 및 포트
TargetIPAddress:TargetPortAddress
- IPTargetAddress, 콜론 및 대상 PortAddress를 포함하는 문자열로 설정합니다. 예를 들어LocalHost:1234
또는168.82.1.5:5555
입니다.연결 중단 확인란을 선택하여 연결
[on|off]
이 설정된 후 대상에 연결합니다.고급 옵션
통신 패킷 로그
[on|off]
표시 - 디버깅 및 문제 해결을 위해 원시 GDBServer 통신 패킷 로그를 16진수 값으로 표시하려면 확인란을 선택합니다.
원하는 옵션을 선택한 후 확인을 선택하여 연결합니다.
EXDI 구성 XML 파일을 사용하여 고급 옵션 구성
가장 필요한 옵션은 이 항목에 설명된 사용자 인터페이스에서 사용할 수 있습니다. EXDI 구성 XML 파일을 사용하여 고급 옵션을 구성하는 방법에 대한 자세한 내용은 EXDI XML 구성 파일을 참조 하세요.
WinDbg 명령줄 EXDI 예제
명령 프롬프트에서 EXDI 인터페이스를 사용하는 windbg 세션을 시작하려면 다음 옵션을 사용합니다.
c:\Debuggers> windbg.exe -v -kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,InProc=ExdiGdbDrv.dll,DataBreaks=Exdi
진단 목적으로 유용한 추가 출력을 표시하기 위해 -v: 자세한 정보 표시 세션을 사용할 수 있습니다. WinDbg 옵션에 대한 일반적인 내용은 WinDbg 명령줄 옵션을 참조 하세요. 자세한 내용은 아래의 EXDI WinDbg 부하 매개 변수를 참조하세요.
디버거 콘솔에는 EXDI 전송 초기화가 표시됩니다.
EXDI: DbgCoInitialize returned 0x00000001
EXDI: CoCreateInstance() returned 0x00000000
EXDI: QueryInterface(IExdiServer3) returned 0x00000000
EXDI: Server::GetTargetInfo() returned 0x00000000
EXDI: Server::SetKeepaliveInterface() returned 0x00000000
EXDI: Server::GetNbCodeBpAvail() returned 0x00000000
EXDI: ExdiNotifyRunChange::Initialize() returned 0x00000000
EXDI: LiveKernelTargetInfo::Initialize() returned 0x00000000
EXDI: Target initialization succeeded
Kernel Debugger connection established
EXDIGdbServer 콘솔 창에는 EXDI 연결 상태에 대한 정보도 표시할 수 있습니다. 콘솔에 대한 자세한 내용은 문제 해결을 참조 하세요.
EXDI WinDbg 로드 매개 변수
다음 매개 변수는 WinDbg와 함께 EXDI 커널 세션을 시작하는 데 사용됩니다.
-kx EXDI:Options
다음 EXDI 옵션은 -kx 옵션과 함께 사용할 수 있습니다. 각 옵션은 쉼표로 구분해야 합니다.
매개 변수 | 설명 |
---|---|
CLSID | LiveExdiGdbSrvServer에 할당된 클래스 ID입니다(ExdiGdbSrv.idl 파일에 정의된 대로). |
Kd=Guess -또는- NtBaseAddr | 디버거 엔진은 NT 기본 주소를 찾는 일반적인 추론 메커니즘을 사용합니다. |
ForceX86 | 디버거 엔진이 CPU 컨텍스트를 가져오거나 설정하기 위해 IeXdiX86Context3 인터페이스를 사용하도록 합니다. |
DataBreaks=Exdi | 데이터 중단점 사용을 허용합니다. |
Inproc | inproc Exdi-Server를 사용할 수 있습니다. 이 옵션은 권장됩니다. InProc=ExdiGdbDrv.dll |
PathToSrvCfgFiles | EXDI에 대한 XML 구성 파일의 경로입니다. |
추론 검색 및 추론 크기 제어
앞에서 설명한 대로 디버거는 추론 알고리즘을 사용하여 NT 기본 주소를 찾습니다. 추론 검색을 취소하려면 명령줄을 통해 WinDbg를 시작할 때 다음 단계를 완료합니다.
- 연결할 대상 서버에 대한 exdiconfigdata.xml 파일에서 heuristicScanSize를 0으로 설정합니다.
kd=NtBaseAddr
Windbg 명령줄에서 추론 형식을 사용합니다.
XML 구성 파일 작업에 대한 자세한 내용은 EXDI XML 구성 파일을 참조 하세요.
WinDbg를 사용하여 대상 시스템 디버그 - 중단점
이 dbgeng.dll 추론 알고리즘을 사용하여 break 명령이 발생했을 때 NT 기본 부하 주소의 위치를 찾습니다. 프라이빗 기호를 사용할 수 없는 경우 이 프로세스가 실패합니다.
즉, 많은 연결 시퀀스에서 중단이 예상대로 작동하지 않습니다. 코드를 수동으로 중단하면 해당 시점에 Windows가 실행 중이던 임의의 위치가 됩니다. 대상 코드의 기호를 사용할 수 없으므로 기호를 사용하여 중단점을 설정하기 어려울 수 있습니다.
디버거 명령
메모리에 직접 액세스하는 다음과 같은 명령이 작동합니다.
k, kb, kc, kd, kp, kP, kv(디스플레이 스택 백트레이스)
d, da, db, dc, dd, dD, df, dp, dq, du, dw(메모리 표시)
p(단계)를 사용하여 코드를 단계별로 실행할 수 있습니다.
디버그하려는 코드를 찾는 데 사용할 수 있는 명령도 있습니다.
Imgscan은 기존 KDNET 기반 커널 디버깅과 달리 기호를 기반으로 중단점을 설정할 수 없으므로 EDXI 디버깅에 유용할 수 있습니다. 원하는 대상 이미지를 찾은 경우 해당 위치를 사용하여 메모리 액세스 중단점을 쉽게 설정할 수 있습니다.
.exdicmd(EXDI 명령)
.exdicmd는 활성 EXDI 디버깅 연결을 사용하여 대상 시스템에 EXDI 명령을 보냅니다. 자세한 내용은 .exdicmd(EXDI 명령)를 참조하세요.
문제 해결
ExdiGdbServer 창의 출력을 사용하여 연결 시퀀스를 모니터링합니다.
문제: 오류: GbDServer와의 연결을 설정할 수 없습니다. 연결 문자열 확인 <hostname/ip>:portnumber
이 문제는 다음으로 인해 발생할 수 있습니다.
- ExdiGdbSrv.dll 대상 GDB 서버에 연결할 수 없습니다.
- GDB 서버가 대상에서 아직 실행되고 있지 않습니다.
- 방화벽 문제를 해결하려면 ping, tracert 또는 기타 도구를 사용하여 두 IP 주소에 모두 연결할 수 있는지 확인하여 GDB 트래픽이 방화벽을 통과할 수 있는지 확인합니다.
문제: 대상 시스템의 오류 시나리오를 사용할 수 없음 - 반환된 DbgCoInitialize 0x00000001
대상 시스템이 로드되지 않았거나 사용할 수 없는 경우 다음 출력이 반환될 수 있습니다.
Microsoft (R) Windows Debugger Version 10.0.20317.1 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
EXDI: DbgCoInitialize returned 0x00000001
이는 ExdiGdbSrv.dll COM 서버가 QEMU GDServer에 연결할 수 없으므로 다음으로 인해 실패할 수 있는 일반적인 오류입니다.
ExdiGdbSrv.dll 이전 세션은 여전히 dllhost.exe 프로세스에서 호스트되므로 dllhost.exe 프로세스를 종료해야 합니다. 명령 프롬프트에서 ExdiGdbSrv.dll
TaskList
호스트하는 dllhost.exe PID를 찾습니다. 연결된 PID를 사용하고TaskKill /PID <PID ID> /f
종료합니다. PID 작업에 대한 자세한 내용은 프로세스 ID 찾기를 참조하세요.QEMU gdbserver가 아직 시작되지 않았거나 exdiconfigdata.xml 파일에 잘못된 IP:포트 값이 포함되어 있습니다. WinDbg 세션이 QEMU Windows VM과 동일한 호스트 PC에서 시작되면 IP=LocalHost입니다.
DLLHOST.EXE 프로세스(COM 관련)를 통해 EXDI COM 서버(ExdiGDbSrv.dll)를 시작할 때 실패했습니다. 이 문제를 해결하려면 호스트 디버거 PC 또는 로그아웃 Windows를 다시 시작하고 다시 로그인합니다. 작동하지 않는 경우 다시 시작/로그인한 후 EXDI COM 서버를 다시 등록합니다.
regsvr32.exe <full path to the ExdiGdbSrv.dll)
문제: 디버깅 세션을 시작할 수 없습니다. FAILURE HR=0x80004005:AttachKernel에 실패했습니다.
이 문제는 다음으로 인해 발생할 수 있습니다.
- 위에서 설명한 대로 ExdiGdbSrv.dll 이전 세션이 여전히 활성 상태일 수 있습니다. 위에서 설명한 대로 연결된 DLL 호스트를 찾아서 종료합니다.
문제: EXDI를 사용하여 커널 디버깅을 시작할 수 없습니다.
이 문제는 다음으로 인해 발생할 수 있습니다.
- 호스트 디버거 머신에서 실행되는 ExdiGdbSrv.dll(dllhost.exe 호스팅)의 또 다른 인스턴스가 있습니다.
- ExdiGdbSrv.dll 호스팅하는 COM 서비스의 추가 인스턴스를 종료합니다.
- 먼저 호스트 PC에서 TList와 같은 유틸리티를 사용하여 프로세스를 나열합니다. ExdiGdbSrv.dll 호스팅하는 DLLHost는 ExdiGdbServer를 표시합니다.
tlist 261928 dllhost.exe ExdiGdbServer
kill -f XXXXX
디버거 명령 프롬프트에서 프로세스 번호를 사용하여 프로세스를 종료합니다.
- 먼저 호스트 PC에서 TList와 같은 유틸리티를 사용하여 프로세스를 나열합니다. ExdiGdbSrv.dll 호스팅하는 DLLHost는 ExdiGdbServer를 표시합니다.
문제: 오류: GdbServer 세션을 구성할 수 없습니다.
이 문제는 다음으로 인해 발생할 수 있습니다.
- XML 구성 파일의 경로와 같은 세션 정보를 찾는 동안 오류가 발생했습니다.
문제: 오류: EXDI_GDBSRV_XML_CONFIG_FILE 환경 변수가 정의되지 않았습니다.
이 문제는 다음으로 인해 발생할 수 있습니다.
- ExdiGdbSrv.dll 환경 변수는 설정되지 않았거나 환경에서 사용할 수 없습니다.
문제: 오류: EXDI_GDBSRV_XML_CONFIG_FILE 환경 변수가 정의되지 않았습니다. 이 시점에서 Exdi-GdbServer 샘플은 계속되지 않습니다. Exdi XML 구성 파일의 전체 경로를 설정합니다.
이 문제는 다음으로 인해 발생할 수 있습니다.
- EXDI_GDBSRV_XML_CONFIG_FILE 환경 변수가 설정되지 않았습니다 . 경우에 따라 "확인" 단추를 누르면 ExdiGDbSrv.dll 계속 작동하지만 windbg.exe 시스템 레지스터를 쿼리하지 못합니다(예: rdmsr/wrmsr 함수를 통해).