Debuggen von DirectShow-Filtern
Viele der in diesem Thema beschriebenen Debugmöglichkeiten sind in der DirectShow-Basisklassenbibliothek implementiert. Weitere Informationen finden Sie unter DirectShow-Basisklassen.
Assertionsüberprüfung
Verwenden Sie assertionsüberprüfungen. Assertionen können Annahmen überprüfen, die Sie in Ihrem Code zu Vorbedingungen und Nachbedingungen treffen. DirectShow bietet mehrere Assertionsmakros. Weitere Informationen finden Sie unter Assert- und Breakpointmakros.
Objektnamen
In Debugbuilds gibt es eine globale Liste von -Objekten, die von der CBaseObject-Klasse abgeleitet werden. Wenn Objekte erstellt werden, werden sie der Liste hinzugefügt. Wenn sie zerstört werden, werden sie aus der Liste entfernt. Um eine Liste dieser Objekte anzuzeigen, rufen Sie die DbgDumpObjectRegister-Funktion auf.
Die Konstruktormethode für die CBaseObject-Basisklasse und die meisten davon abgeleiteten Klassen enthalten einen Parameter für den Namen des Objekts. Geben Sie Ihren Objekten eindeutige Namen, um sie zu identifizieren. Verwenden Sie das NAME-Makro, wenn Sie den Namen deklarieren, damit der Name nur in Debugbuilds zugeordnet wird. In Einzelhandels-Builds wird der Name ZU NULL.
Debugprotokollierung
Die DbgLog-Funktion zeigt Debugmeldungen an, während das Programm ausgeführt wird. Verwenden Sie diese Funktion, um die Ausführung Ihrer Anwendung oder Ihres Filters zu verfolgen. Sie können Rückgabecodes, die Werte von Variablen und alle anderen relevanten Informationen protokollieren.
Jede Debugmeldung verfügt über einen Typ, z. B. LOG TRACE oder LOG ERROR, und eine Debugebene, die die Wichtigkeit _ _ der Nachricht angibt. Nachrichten mit niedrigeren Debugebenen sind wichtiger als Nachrichten mit höheren Ebenen.
Im folgenden Beispiel trennt ein hypothetischer Filter eine Stecknadel von einem Array von Stecknadeln. Wenn der Verbindungsversuch erfolgreich ist, zeigt der Filter eine LOG _ TRACE-Meldung an. Wenn der Versuch fehlschlägt, wird eine LOG _ ERROR-Meldung angezeigt:
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));
Beim Debuggen können Sie die Debugebene für jeden Nachrichtentyp festlegen. Außerdem verwaltet jedes Modul (DLL oder ausführbare Datei) seine eigenen Debugebenen. Wenn Sie einen Filter testen, erhöhen Sie die Debugebenen für die DLL, die den Filter enthält.
Weitere Informationen finden Sie unter Debugausgabefunktionen.
Kritische Abschnitte
Um die Nachverfolgung von Deadlocks zu vereinfachen, schließen Sie Assertionen ein, die bestimmen, ob der aufrufende Code einen bestimmten kritischen Abschnitt besitzt. Die Funktionen CritCheckIn und CritCheckOut geben an, ob der aufrufende Thread einen kritischen Abschnitt besitzt. In der Regel würden Sie diese Funktionen innerhalb eines Assert-Makros aufrufen.
Sie können auch die DbgLockTrace-Funktion verwenden, um zu verfolgen, wann kritische Abschnitte gehalten oder freigegeben werden.