Share via


ACX 로깅 및 디버깅

이 항목에서는 ACX 오디오 클래스 확장의 로깅, 추적 및 디버깅에 대한 정보를 제공합니다.

참고

ACX 헤더 및 라이브러리는 WDK 10.0.22621.2428(2023년 10월 24일 릴리스)에 포함되지 않지만 이전 버전과 WDK의 최신(25000 시리즈 빌드) Insider Preview에서 사용할 수 있습니다. WDK의 미리 보기 버전에 대한 자세한 내용은 WDK(Windows 드라이버 키트)의 미리 보기 버전 설치를 참조하세요.

ACX 드라이버 로깅

드라이버용 소프트웨어 추적은 일반적으로 커널 모드 및 사용자 모드 프로세스 모두에 대한 추적 메시지를 기록하는 커널 수준 기능인 ETW(Windows용 이벤트 추적)를 기반으로 합니다. ACX 드라이버는 WDF 드라이버이므로 모든 WDF 로깅 및 이벤트 기능을 ACX 드라이버 개발자가 사용할 수 있습니다.

Wpp

ETW는 사용하기가 다소 복잡할 수 있으므로 대부분의 드라이버 개발자는 ETW 추적을 위해 드라이버를 계측하는 프로세스를 간소화하고 향상시키는 WPP(Windows 소프트웨어 추적 전처리기)를 사용합니다.

ACX는 추적 및 디버깅에 WPP 로그를 사용합니다. 자세한 내용은 KMDF 드라이버에서 WPP 소프트웨어 추적 사용Windows 드라이버에 WPP 소프트웨어 추적 추가를 참조하세요.

In-Flight 레코더(IFR)

IFR(In-Flight 레코더)이 지원되며 WDFKD, RCDRKD 또는 ACXKD 디버거 확장을 통해 볼 수 있습니다. IFR 로그로 작업하는 일반적인 정보는 KMDF에서 IFR(Inflight Trace Recorder) 사용 및 UMDF 2 드라이버비디오: 디버거 없이 드라이버 IFR 로그 액세스를 참조하세요.

ACX는 다른 ETW 공급자를 사용하여 주요 이벤트를 기록하여 이러한 특수 이벤트의 시각화를 간소화합니다.

드라이버에 로깅 추가

타사 드라이버는 WPP 및 ETW 이벤트도 사용하는 것이 좋습니다.

이 예제 코드는 반환 값을 확인하고 적절한 오류를 로깅하는 방법을 보여줍니다.


    //
    // The driver uses this DDI to delete the circuits from the current device. 
    //
    status = AcxDeviceRemoveCircuit(Device, devCtx->Speaker);
    if (!NT_SUCCESS(status)) { DrvLogError(g_AudioDspLog, FLAG_INIT, L"Failed to remove speaker circuit, continuing with ReleaseHardware, %!STATUS!", status); }
    status = AcxDeviceRemoveCircuit(Device, devCtx->MicArray);
    if (!NT_SUCCESS(status)) { DrvLogError(g_AudioDspLog, FLAG_INIT, L"Failed to remove micarray circuit, continuing with ReleaseHardware, %!STATUS!", status); }
    status = AcxDeviceRemoveCircuit(Device, devCtx->SpeakerHp);
    if (!NT_SUCCESS(status)) { DrvLogError(g_AudioDspLog, FLAG_INIT, L"Failed to remove speakerHp circuit, continuing with ReleaseHardware, %!STATUS!", status); }
    status = AcxDeviceRemoveCircuit(Device, devCtx->MicrophoneHp);
    if (!NT_SUCCESS(status)) { DrvLogError(g_AudioDspLog, FLAG_INIT, L"Failed to remove microphoneHp circuit, continuing with ReleaseHardware, %!STATUS!", status); }
    status = AcxDeviceRemoveCircuit(Device, devCtx->HDMI);
    if (!NT_SUCCESS(status)) { DrvLogError(g_AudioDspLog, FLAG_INIT, L"Failed to remove HDMI circuit, continuing with ReleaseHardware, %!STATUS!", status); }

토스터 드라이버 샘플 코드의 추천 버전은 WMI 추적의 예제와 재사용 가능한 추적 코드를 제공합니다. 토스터 샘플에 대한 자세한 내용은 Toaster 샘플 드라이버를 참조하세요.

ACX 드라이버 로깅에 대한 권장 사항

ACX 드라이버의 안정성을 개선하기 위해 로깅에 대해 다음 동작을 고려합니다.

  • 스트림 버퍼 IO 또는 기타 일반 신호 처리 작업의 예기치 않은 반환 값입니다.
  • 예기치 않은 전원 상태 또는 전원 상태 전환.
  • 업데이트 또는 다시 설치하는 동안 발생한 호출과 관련된 오류입니다.
  • "오디오 없음"으로 이어질 수 있는 다른 동작은 로깅에 고려될 수 있습니다.

WMI 추적 디버거 확장 사용

디버거에서 추적 이벤트를 보려면 WMI 확장을 사용하여 Wmitrace.dll. WMI 이벤트 추적을 제어하고 볼 수 있도록 설계된 함수 라이브러리가 포함되어 있습니다. 자세한 내용은 WMI 추적 확장(Wmitrace.dll)을 참조하세요.

ACX 드라이버 디버깅

ACX 드라이버는 WDF 드라이버이므로 WDF 드라이버에 대해 설명된 디버깅 기술은 ACX 드라이버에 적용됩니다. WDF 드라이버 디버깅에 대한 자세한 내용은 다음 topics 참조하세요.

디버깅 도구에 대한 일반 정보

Windows용 디버깅 도구(WinDbg, KD, CDB, NTSD)

KMDF 디버깅

비디오 연습

ACX 커널 디버거 확장 라이브러리(AcxKd.dll)

디버깅을 지원하기 위해 ACX에는 도우미 커널 디버거 확장 라이브러리(AcxKd.dll)가 있습니다. 이 라이브러리는 개발자가 단일 및 다중 스택 오디오 경로에서 문제를 추적하는 데 도움이 됩니다. kd 확장을 사용하면 개발자가 ACX 구조체 내부를 살펴볼 수 있습니다.

참고

이 디버거 확장은 개발 중이며 사용 가능한 경우 여기에 정보가 제공됩니다.

추가 정보

ACX 오디오 클래스 확장 개요

ACX 개체 요약