Macros de relatórios de erros e depuração
Essas macros fornecem recursos úteis de depuração e rastreamento.
Nome | Descrição |
---|---|
_ATL_DEBUG_INTERFACES | Grava, na janela de saída, todos os vazamentos de interface detectados quando _Module.Term é chamado. |
_ATL_DEBUG_QI | Grava todas as chamadas para QueryInterface na janela de saída. |
ATLASSERT | Executa a mesma funcionalidade que a macro _ASSERTE localizada na biblioteca de runtime C. |
ATLENSURE | Executa a validação de parâmetros. Chama AtlThrow , se necessário |
ATLTRACENOTIMPL | Envia uma mensagem ao dispositivo de despejo informando que a função especificada não foi implementada. |
ATLTRACE | Relata os avisos a um dispositivo de saída, como a janela do depurador, de acordo com os sinalizadores e os níveis indicados. Incluído para compatibilidade com versões anteriores. |
ATLTRACE2 | Relata os avisos a um dispositivo de saída, como a janela do depurador, de acordo com os sinalizadores e os níveis indicados. |
_ATL_DEBUG_INTERFACES
Defina essa macro antes de incluir arquivos de cabeçalho de ATL para rastrear todas as chamadas AddRef
e Release
nas interfaces dos componentes para a janela de saída.
#define _ATL_DEBUG_INTERFACES
Comentários
A saída de rastreamento aparecerá conforme mostrado abaixo:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
A primeira parte de cada traço será sempre ATL: QIThunk
. Em seguida, há um valor que identifica a conversão de interface que está sendo usada. Uma conversão de interface é um objeto utilizado para manter uma contagem de referência e fornecer o recurso de rastreamento usado aqui. Uma nova conversão de interface é criada em cada chamada para QueryInterface
exceto de solicitações para a interface IUnknown
(nesse caso, a mesma conversão será retornada sempre para cumprir as regras de identidade do COM).
Em seguida, você verá AddRef
ou Release
indicando qual método foi chamado. Depois disso, você verá um valor identificando o objeto que teve a contagem de referência de interface alterada. O valor rastreado é o ponteiro this
do objeto.
A contagem de referência é rastreada é a contagem de referência nessa conversão depois que AddRef
ou Release
foi chamado. Observe que essa contagem de referência poderá não corresponder à contagem de referência do objeto. Cada conversão mantém sua própria contagem de referência para ajudar você a cumprir totalmente as regras de contagem de referência do COM.
A informação final rastreada é o nome do objeto e a interface que está sendo afetada pela chamada AddRef
ou Release
.
Todos os vazamentos de interface detectados quando o servidor desligar e _Module.Term
for chamado serão registrados dessa maneira:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
As informações fornecidas aqui são mapeadas diretamente para as informações fornecidas nas instruções de rastreamento anteriores, de modo que será possível examinar as contagens de referência durante todo o tempo de vida de uma conversão de interface. Além disso, você obtém uma indicação da contagem máxima de referência nessa conversão de interface.
Observação
_ATL_DEBUG_INTERFACES pode ser utilizado em builds de varejo.
_ATL_DEBUG_QI
Grava todas as chamadas para QueryInterface
na janela de saída.
#define _ATL_DEBUG_QI
Comentários
Se uma chamada para QueryInterface
falhar, a janela de saída exibirá:
nome da interface - failed
ATLASSERT
A macro ATLASSERT executa a mesma funcionalidade que a macro _ASSERTE localizada na biblioteca de runtime C.
ATLASSERT(booleanExpression);
Parâmetros
booleanExpression
Expressão (incluindo ponteiros) que é avaliada como diferente de zero ou 0.
Comentários
Em builds de depuração, o ATLASSERT avalia booleanExpression e gera um relatório de depuração quando o resultado é falso.
Requisitos
Cabeçalho: atldef.h
ATLENSURE
Essa macro é usada para validar os parâmetros passados para uma função.
ATLENSURE(booleanExpression);
ATLENSURE_THROW(booleanExpression, hr);
Parâmetros
booleanExpression
Especifica uma expressão booliana a ser testada.
RH
Especifica um código de erro a ser retornado.
Comentários
Essas macros fornecem um mecanismo para detectar e notificar o usuário sobre o uso incorreto de parâmetros.
A macro chama ATLASSERT e, se a condição falhar, chamará AtlThrow
.
No caso ATLENSURE, AtlThrow
é chamado com E_FAIL.
No caso ATLENSURE_THROW, AtlThrow
é chamado com o HRESULT especificado.
A diferença entre ATLENSURE e ATLASSERT é que ATLENSURE gera uma exceção em builds de versão e em builds de depuração.
Exemplo
void MyImportantFunction(char* psz)
{
ATLENSURE(NULL != psz);
char mysz[64];
strcpy_s(mysz, sizeof(mysz), psz);
}
Requisitos
Cabeçalho: afx.h
ATLTRACENOTIMPL
Em builds de depuração de ATL, envia a cadeia de caracteres "funcname não está implementado" ao dispositivo de despejo e retorna E_NOTIMPL.
ATLTRACENOTIMPL(funcname);
Parâmetros
funcname
[in] Uma cadeia de caracteres contendo o nome da função que não está implementada.
Comentários
Nas compilações de versão, simplesmente retorna E_NOTIMPL.
Exemplo
ATLTRACENOTIMPL(_T("IOleControl::GetControlInfo"));
Requisitos
Cabeçalho: atltrace.h
ATLTRACE
Relata os avisos a um dispositivo de saída, como a janela do depurador, de acordo com os sinalizadores e os níveis indicados. Incluído para compatibilidade com versões anteriores.
ATLTRACE(exp);
ATLTRACE(
DWORD category,
UINT level,
LPCSTR lpszFormat, ...);
Parâmetros
exp
[in] A cadeia de caracteres e as variáveis a serem enviadas para a janela de saída ou qualquer aplicativo que intercepte essas mensagens.
category
[in] Tipo de evento ou método sobre o qual relatar. Consulte os Comentários para obter uma lista de categorias.
level
[in] O nível de rastreamento para relatar. Consulte os Comentários para obter os detalhes.
lpszFormat
[in] A cadeia de caracteres formatada a ser enviada ao dispositivo de despejo.
Comentários
Consulte ATLTRACE2 para obter uma descrição de ATLTRACE. ATLTRACE e ATLTRACE2 têm o mesmo comportamento, ATLTRACE está incluído para compatibilidade com versões anteriores.
ATLTRACE2
Relata os avisos a um dispositivo de saída, como a janela do depurador, de acordo com os sinalizadores e os níveis indicados.
ATLTRACE2(exp);
ATLTRACE2(
DWORD category,
UINT level,
LPCSTR lpszFormat, ...);
Parâmetros
exp
[in] A cadeia de caracteres a ser enviada para a janela de saída ou qualquer aplicativo que intercepte essas mensagens.
category
[in] Tipo de evento ou método sobre o qual relatar. Consulte os Comentários para obter uma lista de categorias.
level
[in] O nível de rastreamento para relatar. Consulte os Comentários para obter os detalhes.
lpszFormat
[in] A cadeia de caracteres do formato estilo printf
a ser usada para criar uma cadeia de caracteres para enviar ao dispositivo de despejo.
Comentários
A forma abreviada de ATLTRACE2 grava uma cadeia de caracteres na janela de saída do depurador. A segunda forma de ATLTRACE2 também grava a saída na janela de saída do depurador, mas está sujeita às configurações da Ferramenta de Rastreamento do ATL/MFC (consulte Exemplo de ATLTraceTool). Por exemplo, se você definir o nível como 4 e a Ferramenta de Rastreamento do ATL/MFC como nível 0, você não verá a mensagem. O nível pode ser 0, 1, 2, 3 ou 4. O padrão, 0, relata apenas os problemas mais sérios.
O parâmetro da categoria lista os sinalizadores de rastreamento a serem definidos. Esses sinalizadores correspondem aos tipos de métodos para os quais você quer relatar. As tabelas abaixo listam os sinalizadores de rastreamento válidos que podem ser utilizados para o parâmetro da categoria.
Sinalizadores de rastreamento ATL
Categoria ATL | Descrição |
---|---|
atlTraceGeneral |
Relatórios sobre todos os aplicativos ATL. O padrão. |
atlTraceCOM |
Relatórios sobre os métodos COM. |
atlTraceQI |
Relatórios sobre as chamadas QueryInterface. |
atlTraceRegistrar |
Relatórios sobre o registro de objetos. |
atlTraceRefcount |
Relatórios sobre a alteração de contagem de referência. |
atlTraceWindowing |
Relatórios sobre os métodos do Windows, por exemplo, relata uma ID do mapa de mensagem inválida. |
atlTraceControls |
Relatórios sobre os controles, por exemplo, relata quando um controle ou a janela é destruído. |
atlTraceHosting |
Relatórios de hospedagem de mensagens, por exemplo, relata quando um cliente em um contêiner é ativado. |
atlTraceDBClient |
Relatórios sobre o modelo de consumidor OLE DB, por exemplo, quando uma chamada para GetData falha, a saída pode conter o HRESULT. |
atlTraceDBProvider |
Relatórios sobre o modelo de provedor OLE DB, por exemplo, relata se a criação de uma coluna falhou. |
atlTraceSnapin |
Relatórios para o aplicativo SnapIn do MMC. |
atlTraceNotImpl |
Relata que a função indicada não foi implementada. |
atlTraceAllocation |
Relata as mensagens impressas pelas ferramentas de depuração de memória em atldbgmem.h. |
Sinalizadores de rastreamento do MFC
Categoria do MFC | Descrição |
---|---|
traceAppMsg |
Uso geral, mensagens do MFC. Sempre recomendado. |
traceDumpContext |
Mensagens de CDumpContext. |
traceWinMsg |
Mensagens do código de manipulação de mensagens do MFC. |
traceMemory |
Mensagens do código de gerenciamento de memória do MFC. |
traceCmdRouting |
Mensagens do código de roteamento de comando do Windows do MFC. |
traceHtml |
Mensagens do suporte para diálogo de DHTML do MFC. |
traceSocket |
Mensagens do suporte para soquete do MFC. |
traceOle |
Mensagens do suporte para OLE do MFC. |
traceDatabase |
Mensagens do suporte para banco de dados do MFC. |
traceInternet |
Mensagens do suporte para Internet do MFC. |
Para declarar uma categoria de rastreamento personalizada, declare uma instância global da classe CTraceCategory
conforme a seguir:
CTraceCategory MY_CATEGORY(_T("MyCategoryName"), 1);
O nome da categoria, MY_CATEGORY neste exemplo, é o nome especificado para o parâmetro da categoria. O primeiro parâmetro é o nome da categoria que aparecerá na ferramenta de rastreamento do ATL/MFC. O segundo parâmetro é o nível de rastreamento padrão. Esse parâmetro é opcional e o nível de rastreamento padrão é 0.
Para usar uma categoria definida pelo usuário:
ATLTRACE2(MY_CATEGORY, 2, _T("a message in a custom category"));
Para especificar que você quer filtrar as mensagens de rastreamento, insira as definições para essas macros em Stdafx.h antes da instrução #include <atlbase.h>
.
Como alternativa, você pode definir o filtro nas diretivas do pré-processador na caixa de diálogo Páginas de Propriedades. Clique na guia Pré-processador e, em seguida, insira o global na caixa de edição Definições do Pré-processador.
Atlbase.h contém as definições padrão das macros ATLTRACE2 e essas definições serão usadas se você não definir esses símbolos antes que atlbase.h seja processado.
Nas compilações de versão, ATLTRACE2 compila para (void) 0
.
ATLTRACE2 limitará o conteúdo da cadeia de caracteres a ser enviada ao dispositivo de despejo para no máximo 1023 caracteres após a formatação.
ATLTRACE e ATLTRACE2 têm o mesmo comportamento, ATLTRACE está incluído para compatibilidade com versões anteriores.
Exemplo
int i = 1;
ATLTRACE2(atlTraceGeneral, 4, "Integer = %d\n", i);
// Output: 'Integer = 1'