2010-06-09 16 views
9

Jakie narzędzia do debugowania są dostępne dla filtrów DirectShow? Obecnie mam projekt, który kompiluje i rejestruje filtr źródła wideo, a następnie ustawiam wykres w GraphEdit. Używam C++ w visual studio 2008. Czy jest możliwe, aby debugger dołączony do filtra w jakikolwiek sposób, gdzie można ustawić punkty przerwania, sprawdzić zmienne, itp? Czy istnieje możliwość zapisania informacji diagnostycznych w miejscu, które mogę wyświetlać w czasie rzeczywistym?Jak debugować filtr DirectShow w C++

Odpowiedz

12

Nie powinno być problemu z dołączeniem debuggera. Ustaw graphedt.exe jako cel debugowania w projekcie Visual Studio filtru, a powinieneś mieć możliwość ustawiania punktów przerwań w kodzie. Jeśli masz z tym problemy, może to być spowodowane logiką anty-debugowania w niektórych dekoderach - musisz ich unikać.

Możesz również uzyskać przydatne informacje na temat debugowania, rejestrując dostawy oraz ich sygnatury czasowe i opóźnienia. Najlepszym sposobem na znalezienie tego jest użycie filtra tranzytowego. Istnieje przykładowy filtr monitorowy, taki jak ten, dostępny w postaci źródłowej i binarnej ze strony www.gdcl.co.uk/mobile (win32 i wygraj w wersji mobilnej).

G

+3

Omigod. Nie miałem pojęcia, że ​​możesz tak podłączyć debuggera. To jest spektakularne. –

0

Najlepszym sposobem debugowania aplikacji czasu rzeczywistego jest generowanie plików dziennika. Aby wyświetlać informacje dziennika w czasie rzeczywistym, wystarczy utworzyć rejestrowanie oparte na gniazdach klienta. Na przykład Twoja aplikacja może zacząć słuchać portu. Zewnętrzna aplikacja przeglądarki (klient) może połączyć się z tym portem i zacznie otrzymywać informacje dziennika w czasie rzeczywistym.

6

W kompilacji debugowania, gdy DirectShow klasy bazowe zawierają już elastyczny mechanizm logowania kontrolowanej przez klucze rejestru. Klasy bazowe same używają tego mechanizmu do rejestrowania własnej operacji. W razie potrzeby powinna istnieć możliwość modyfikacji klas bazowych, aby rejestrowanie było dostępne w kompilacji wydania diagnostycznego.

Prosty przykład:

DbgLog((LOG_TIMING, 1, TEXT(__FUNCTION__ " : Frame:%d, Stream Time:%dms, Sample Time:%dms"), 
(int)currentFrame, (int)currentTime, (int)sampleTime)); 

To daje wyjście dziennika poprzedzony nazwą funkcji wywołującej jeśli poziom rejestrowania dla kategorii „TIMING” jest ustawiony na> = 1. Poziomy rejestrowania dla każdej kategorii są konfigurowane w rejestrze pod kluczem poniżej. Istnieje podklucz "GLOBALNY" dla minimalnego poziomu rejestrowania dla wszystkich filtrów i podkluczy dla dodatkowego rejestrowania według nazwy pliku filtra.

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DirectShow \ Debug HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ \ Debug DirectShow (kod 32bit na x64 Windows).

Edytuj klucz "LogToFile" dla każdego filtra, aby określić miejsce docelowe rejestrowania. Domyślnie jest to "Debugowanie" (dane wyjściowe debuggera), ale może to być również "Konsola" do logowania do okna konsoli lub nazwa pliku do zalogowania. Można również dodać inne rodzaje rejestrowania.

Opcja konsoli jest szczególnie przydatna do monitorowania na żywo bez debuggera. W moim systemie klasy bazowe nie otwierają okna konsoli, jeśli jeszcze nie są otwarte, więc dodałem następującą modyfikację wxdebug.cpp, aby bezwarunkowo otworzyć konsolę, jeśli żądanie konsoli jest wymagane.

if (!lstrcmpi(szFile, TEXT("Console"))) { 
     AllocConsole();  // modification - always allocate console if using Console output 

Aby uzyskać więcej informacji, patrz DirectShow Debug Output Functions.

3

Niektóre narzędzia do analizy przepływu danych pomiędzy filtrami: edytor wykres

Open source GraphStudioNext filtr analizator (i analizator plik pisarz) pokaże wizualny dziennik aktywności po włożeniu pomiędzy dwoma filtrami zainteresowania.Musisz zbudować go samodzielnie, aby uzyskać tę funkcję na teraz.

Geraint Davie's monitor filter napisze plik dziennika aktywności na dysk.