디버깅 DirectShow 필터

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 항목에 설명된 많은 디버깅 기능은 DirectShow 기본 클래스 라이브러리에서 구현됩니다. 자세한 내용은 DirectShow 기본 클래스를 참조하세요.

어설션 검사

어설션 검사를 자유롭게 사용합니다. 어설션은 코드에서 전제 조건 및 사후 조건에 대한 가정을 확인할 수 있습니다. DirectShow는 여러 어설션 매크로를 제공합니다. 자세한 내용은 어설션 및 중단점 매크로를 참조하세요.

개체 이름

디버그 빌드에는 CBaseObject 클래스에서 파생되는 개체의 전역 목록이 있습니다. 개체가 만들어지면 목록에 추가됩니다. 제거되면 목록에서 제거됩니다. 이러한 개체의 목록을 표시하려면 DbgDumpObjectRegister 함수를 호출합니다.

CBaseObject 기본 클래스의 생성자 메서드와 CBaseObject 기본 클래스에서 파생된 대부분의 클래스에는 개체 이름에 대한 매개 변수가 포함됩니다. 개체를 식별할 수 있는 고유한 이름을 지정합니다. 이름을 선언할 때 NAME 매크로를 사용하여 이름이 디버그 빌드에서만 할당되도록 합니다. 소매 빌드에서 이름은 NULL이 됩니다.

디버그 로깅

DbgLog 함수는 프로그램이 실행됨에 따라 디버깅 메시지를 표시합니다. 이 함수를 사용하여 애플리케이션 또는 필터의 실행을 추적합니다. 반환 코드, 변수 값 및 기타 관련 정보를 기록할 수 있습니다.

모든 디버그 메시지에는 LOG_TRACE 또는 LOG_ERROR 같은 형식과 메시지의 중요성을 나타내는 디버그 수준이 있습니다. 디버그 수준이 낮은 메시지는 더 높은 수준의 메시지보다 더 중요합니다.

다음 예제에서 가상 필터는 핀 배열에서 핀의 연결을 끊습니다. 연결 끊기 시도가 성공하면 필터에 LOG_TRACE 메시지가 표시됩니다. 시도가 실패하면 LOG_ERROR 메시지가 표시됩니다.

hr = m_PinArray[iPin]->Disconnect();
if (FAILED(hr))
{
    DbgLog((
        LOG_ERROR, 
        1, 
        TEXT("Could not disconnect pin %d. HRESULT = %#x", 
        iPin, 
        hr
        ));
 
   // Error handling code (not shown).
}
DbgLog((LOG_TRACE, 3, TEXT("Disconnected pin %d"), iPin));

디버깅할 때 각 메시지 유형에 대한 디버그 수준을 설정할 수 있습니다. 또한 각 모듈(DLL 또는 실행 파일)은 자체 디버깅 수준을 유지 관리합니다. 필터를 테스트하는 경우 필터가 포함된 DLL에 대한 디버그 수준을 높입니다.

자세한 내용은 출력 함수 디버그를 참조하세요.

중요 섹션

교착 상태를 더 쉽게 추적하려면 호출 코드가 지정된 중요 섹션을 소유하는지 여부를 결정하는 어설션을 포함합니다. CritCheckInCritCheckOut 함수는 호출 스레드가 중요한 섹션을 소유하는지 여부를 나타냅니다. 일반적으로 어설션 매크로 내에서 이러한 함수를 호출합니다.

DbgLockTrace 함수를 사용하여 중요한 섹션이 유지되거나 해제되는 시기를 추적할 수도 있습니다.

DirectShow에서 디버깅