Udostępnij przez


Debugowanie filtrów DirectShow

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEngineoraz Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w ramach Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Wiele obiektów debugowania opisanych w tym temacie jest implementowanych w bibliotece klas bazowych DirectShow. Aby uzyskać więcej informacji, zobacz Klasy bazowe DirectShow.

Sprawdzanie asercji

Używaj sprawdzania asercji często. Asercje mogą zweryfikować założenia, które zaimplementujesz w swoim kodzie dotyczące warunków wstępnych i końcowych. DirectShow udostępnia kilka makr asercji. Aby uzyskać więcej informacji, zobacz Assert and Breakpoint Macros.

Nazwy obiektów

W kompilacjach debugowania istnieje globalna lista obiektów, które pochodzą z klasy CBaseObject. Podczas tworzenia obiektów są one dodawane do listy. Gdy zostaną zniszczone, zostaną usunięte z listy. Aby wyświetlić listę tych obiektów, wywołaj funkcję DbgDumpObjectRegister.

Metoda konstruktora dla klasy bazowej CBaseObject — i większość klas pochodnych — zawiera parametr nazwy obiektu. Nadaj obiektom unikatowe nazwy, aby je zidentyfikować. Użyj makra NAME przy deklarowaniu nazwy, aby nazwa była przydzielona tylko w wersjach debugowych. W kompilacjach detalicznych nazwa staje się NULL.

Rejestrowanie debugowania

FunkcjadbgLogwyświetla komunikaty debugowania podczas wykonywania programu. Ta funkcja służy do śledzenia wykonywania aplikacji lub filtru. Możesz rejestrować kody zwracane, wartości zmiennych i inne istotne informacje.

Każdy komunikat debugowania ma typ, taki jak LOG_TRACE lub LOG_ERROR, oraz poziom debugowania, który wskazuje ważność komunikatu. Komunikaty o niższych poziomach debugowania są ważniejsze niż te z wyższymi poziomami.

W poniższym przykładzie hipotetyczny filtr rozłącza pin z tablicy pinów. Jeśli próba rozłączenia powiedzie się, filtr wyświetli komunikat LOG_TRACE. Jeśli próba zakończy się niepowodzeniem, zostanie wyświetlony komunikat 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));

Podczas debugowania można ustawić poziom debugowania dla każdego typu komunikatu. Ponadto każdy moduł (biblioteka DLL lub plik wykonywalny) zachowuje własne poziomy debugowania. Jeśli testujesz filtr, podnieś poziomy debugowania dla biblioteki DLL zawierającej filtr.

Aby uzyskać więcej informacji, zobacz Debug output Functions.

Sekcje krytyczne

Aby ułatwić śledzenie zakleszczeń, dołącz asercji, które określają, czy kod wywołujący jest właścicielem danej sekcji krytycznej. Funkcje CritCheckIn i CritCheckOut wskazują, czy wątek wywołujący jest właścicielem sekcji krytycznej. Zazwyczaj te funkcje są wywoływane z poziomu makra asertywnego.

Możesz również użyć funkcji DbgLockTrace, aby śledzić, kiedy sekcje krytyczne są przechowywane lub zwalniane.

Debugowanie w DirectShow