Depurando filtros do DirectShow

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Muitas das instalações de depuração descritas neste tópico são implementadas na biblioteca de classes base do DirectShow. Para obter mais informações, consulte Classes base do DirectShow.

Verificação de asserção

Use a verificação de asserção liberalmente. As declarações podem verificar suposições que você faz em seu código sobre pré-condições e pós-condições. O DirectShow fornece várias macros de asserção. Para obter mais informações, consulte Assert e Breakpoint Macros.

Nomes de objeto

Em builds de depuração, há uma lista global de objetos que derivam da classe CBaseObject . À medida que os objetos são criados, eles são adicionados à lista. Quando eles são destruídos, eles são removidos da lista. Para exibir uma lista desses objetos, chame a função DbgDumpObjectRegister .

O método de construtor para a classe base CBaseObject — e a maioria das classes derivadas dele — inclui um parâmetro para o nome do objeto. Dê aos objetos nomes exclusivos para identificá-los. Use a macro NAME ao declarar o nome, para que o nome seja alocado somente em builds de depuração. Em builds de varejo, o nome se torna NULL.

Registro em log de depuração

A função DbgLog exibe mensagens de depuração à medida que o programa é executado. Use essa função para rastrear a execução do seu aplicativo ou filtro. Você pode registrar códigos de retorno, os valores das variáveis e quaisquer outras informações relevantes.

Cada mensagem de depuração tem um tipo, como LOG_TRACE ou LOG_ERROR, e um nível de depuração, que indica a importância da mensagem. Mensagens com níveis de depuração mais baixos são mais importantes do que aquelas com níveis mais altos.

No exemplo a seguir, um filtro hipotético desconecta um pino de uma matriz de pinos. Se a tentativa de desconexão for bem-sucedida, o filtro exibirá uma mensagem LOG_TRACE. Se a tentativa falhar, ela exibirá uma mensagem 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));

Ao depurar, você pode definir o nível de depuração para cada tipo de mensagem. Além disso, cada módulo (DLL ou executável) mantém seus próprios níveis de depuração. Se você estiver testando um filtro, aumente os níveis de depuração para a DLL que contém o filtro.

Para obter mais informações, consulte Depurar funções de saída.

Seções críticas

Para facilitar o acompanhamento de deadlocks, inclua asserções que determinam se o código de chamada possui uma determinada seção crítica. As funções CritCheckIn e CritCheckOut indicam se o thread de chamada possui uma seção crítica. Normalmente, você chamaria essas funções de dentro de uma macro assert.

Você também pode usar a função DbgLockTrace para rastrear quando seções críticas são mantidas ou liberadas.

Depuração no DirectShow