Compartilhar via


_ATL_DEBUG_INTERFACES

Defina este macro antes de incluir qualquer arquivo de cabeçalho de ATL para rastrear qualquer AddRef e Versão chama interfaces dos seus componentes para a janela de saída.

#define _ATL_DEBUG_INTERFACES

Comentários

A saída de rastreamento serão exibidos como mostrado abaixo:

ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug

a primeira parte de cada rastreamento será sempre ATL: QIThunk.Em seguida é um valor que identifica o thunk de interface específico que está sendo usado.Um thunk de interface é um objeto usado para manter uma contagem de referência e fornecer o recurso de rastreamento usado aqui.Um novo thunk de interface é criado em cada chamada a QueryInterface a exceção de solicitações para a interface de IUnknown (em este caso, o mesmo thunk é retornado todas as vezes para estar de acordo com as regras de identidade COM).

Em seguida você verá AddRef ou a indicação de Versão que método foi chamado.Seguindo isto, você verá um valor para identificar o objeto cuja contagem de referência da interface foi modificada.O valor é rastreado o ponteiro de this do objeto.

Contagem de referência que é rastreada é a contagem de referência em esse thunk após AddRef ou Versão foram chamados.Observe que essa contagem de referência não pode corresponder a contagem de referência para o objeto.Cada thunk mantém sua própria contagem de referência totalmente a seguir para ajudá-lo com as regras de contagem de COM.

O fragmento de informações final rastreado é o nome do objeto e a interface que estão sendo afetados pela chamada de AddRef ou de Versão .

Todos os escapes de interface que são detectados quando termina o servidor e _Module.Term são chamados serão registrados logon como este:

ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug

As informações fornecidas aqui mapeia diretamente às informações fornecidas nas instruções de rastreamento anteriores, então você pode examinar as contagens de referência em todo o tempo de vida de um inteiro thunk da interface.Além de isso, você obtém um indicando de número máximo de referência em esse thunk da interface.

ObservaçãoObservação

_ATL_DEBUG_INTERFACES pode ser usado em construções varejistas.

Dicas

  • Você pode ver quando um novo thunk de interface é criado procurando chamadas de AddRef com Refcount de 1.

  • Você pode ver quando um thunk de interface é destruído procurando chamadas de Release com Refcount de 0.

  • As instruções de rastreamento são saída em um formato separado por tabulação para que você pode facilmente recorte informações em uma planilha como Microsoft Excel para fornecer a filtragem avançada, procurando, e classificando recursos.

  • Se seu código parece funciona bem quando _ATL_DEBUG_INTERFACES não é definido, mas causa violações de acesso quando a macro é definido, você estiver com praticamente certamente um bug combinado errado de contagem de no seu código do cliente, semelhante a aquele mostrado abaixo:

    IBug* pBug = NULL;
    hr = p->QueryInterface(&pBug);
    ATLASSERT(SUCCEEDED(hr));
    IBug* pBug2 = NULL;
    hr = p->QueryInterface(&pBug2);
    ATLASSERT(SUCCEEDED(hr));
    pBug->Release();
    pBug->Release();    // Mismatched - should be pBug2->Release();   
    

    Este código pode parecer para trabalhar em algumas circunstâncias comum, mas é claramente com erros.Para que este código funcione de todo, se baseia em detalhes de implementação de objeto COM que o fornece a interface de IBug (IBug não pode ser implementado como uma interface de rasgo - fora) e é dependente locais (o cliente deve estar no mesmo compartimento a implementação de IBug ).O uso de macro de _ATL_DEBUG_INTERFACES pode trazer esses bugs para iluminar-se.

Consulte também

Outros recursos

Macros de depuração e relatório de erros

Macros de ATL