Débogage des filtres DirectShow
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
La plupart des fonctionnalités de débogage décrites dans cette rubrique sont implémentées dans la bibliothèque de classes de base DirectShow. Pour plus d’informations, consultez Classes de base DirectShow.
Vérification des assertions
Utilisez la vérification des assertions de manière libérale. Les assertions peuvent vérifier les hypothèses que vous faites dans votre code concernant les conditions préalables et les post-conditions. DirectShow fournit plusieurs macros d’assertion. Pour plus d’informations, consultez Macros d’assertion et de point d’arrêt.
Noms d'objets
Dans les builds de débogage, il existe une liste globale d’objets qui dérivent de la classe CBaseObject . À mesure que des objets sont créés, ils sont ajoutés à la liste. Lorsqu’ils sont détruits, ils sont supprimés de la liste. Pour afficher la liste de ces objets, appelez la fonction DbgDumpObjectRegister .
La méthode de constructeur pour la classe de base CBaseObject , et la plupart des classes dérivées de celle-ci, inclut un paramètre pour le nom de l’objet. Donnez à vos objets des noms uniques pour les identifier. Utilisez la macro NAME lorsque vous déclarez le nom, afin que le nom soit alloué uniquement dans les builds de débogage. Dans les builds de vente au détail, le nom devient NULL.
Journalisation du débogage
La fonction DbgLog affiche les messages de débogage pendant l’exécution de votre programme. Utilisez cette fonction pour suivre l’exécution de votre application ou filtre. Vous pouvez consigner les codes de retour, les valeurs des variables et toute autre information pertinente.
Chaque message de débogage a un type, tel que LOG_TRACE ou LOG_ERROR, et un niveau de débogage, qui indique l’importance du message. Les messages avec des niveaux de débogage inférieurs sont plus importants que ceux avec des niveaux plus élevés.
Dans l’exemple suivant, un filtre hypothétique déconnecte une broche d’un tableau de broches. Si la tentative de déconnexion réussit, le filtre affiche un message LOG_TRACE. Si la tentative échoue, un message LOG_ERROR s’affiche :
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));
Lors du débogage, vous pouvez définir le niveau de débogage pour chaque type de message. En outre, chaque module (DLL ou exécutable) conserve ses propres niveaux de débogage. Si vous testez un filtre, augmentez les niveaux de débogage pour la DLL qui contient le filtre.
Pour plus d’informations, consultez Déboguer des fonctions de sortie.
Sections critiques
Pour faciliter le suivi des interblocages, incluez des assertions qui déterminent si le code appelant possède une section critique donnée. Les fonctions CritCheckIn et CritCheckOut indiquent si le thread appelant possède une section critique. En règle générale, vous appelez ces fonctions à partir d’une macro d’assertion.
Vous pouvez également utiliser la fonction DbgLockTrace pour suivre quand des sections critiques sont conservées ou libérées.
Rubriques connexes