Compartir a través de


Depuración de filtros DirectShow

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Muchas de las instalaciones de depuración descritas en este tema se implementan en la biblioteca de clases base directShow. Para obtener más información, vea DirectShow Base Classes.

Comprobación de aserciones

Use la comprobación de aserciones de forma liberal. Las aserciones pueden comprobar las suposiciones que se realizan en el código sobre las condiciones previas y las condiciones posteriores. DirectShow proporciona varias macros de aserción. Para obtener más información, vea Aserción y macros de punto de interrupción.

Nombres de objeto

En las compilaciones de depuración, hay una lista global de objetos que derivan de la clase CBaseObject . A medida que se crean objetos, se agregan a la lista. Cuando se destruyen, se quitan de la lista. Para mostrar una lista de esos objetos, llame a la función DbgDumpObjectRegister .

El método constructor de la clase base CBaseObject (y la mayoría de las clases derivadas de ella) incluye un parámetro para el nombre del objeto. Asigne a los objetos nombres únicos para identificarlos. Use la macro NAME al declarar el nombre, de modo que el nombre solo se asigne en compilaciones de depuración. En las compilaciones comerciales, el nombre se convierte en NULL.

Depurar registro

La función DbgLog muestra los mensajes de depuración a medida que se ejecuta el programa. Use esta función para realizar un seguimiento de la ejecución de la aplicación o el filtro. Puede registrar códigos de retorno, los valores de las variables y cualquier otra información relevante.

Cada mensaje de depuración tiene un tipo, como LOG_TRACE o LOG_ERROR, y un nivel de depuración, que indica la importancia del mensaje. Los mensajes con niveles de depuración inferiores son más importantes que los que tienen niveles superiores.

En el ejemplo siguiente, un filtro hipotético desconecta un pin de una matriz de patillas. Si el intento de desconexión se realiza correctamente, el filtro muestra un mensaje de LOG_TRACE. Si se produce un error en el intento, muestra un mensaje de 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));

Al depurar, puede establecer el nivel de depuración para cada tipo de mensaje. Además, cada módulo (DLL o ejecutable) mantiene sus propios niveles de depuración. Si va a probar un filtro, aumente los niveles de depuración para el archivo DLL que contiene el filtro.

Para obtener más información, consulte Funciones de salida de depuración.

Secciones críticas

Para facilitar el seguimiento de los interbloqueos, incluya aserciones que determinen si el código de llamada posee una sección crítica determinada. Las funciones CritCheckIn y CritCheckOut indican si el subproceso que llama posee una sección crítica. Normalmente, llamaría a estas funciones desde dentro de una macro assert.

También puede usar la función DbgLockTrace para realizar un seguimiento cuando se mantienen o liberan secciones críticas.

Depuración en DirectShow