_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çã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.