Partilhar via


Serviços de Diagnóstico

A Microsoft Foundation Class Library fornece muitos serviços de diagnóstico que facilitam a depuração de seus programas. Esses serviços de diagnóstico incluem macros e funções globais que permitem rastrear as alocações de memória do programa, despejar o conteúdo de objetos durante o tempo de execução e imprimir mensagens de depuração durante o tempo de execução. As macros e funções globais para serviços de diagnóstico são agrupadas nas seguintes categorias:

  • Macros de diagnóstico geral

  • Funções e variáveis diagnósticas gerais

  • Funções de diagnóstico de objetos

Essas macros e funções estão disponíveis para todas as classes derivadas de CObject nas versões Debug e Release do MFC. No entanto, todos, exceto DEBUG_NEW e VERIFY não fazem nada na versão de lançamento.

Na biblioteca Debug, todos os blocos de memória alocados são colocados entre parênteses com uma série de "bytes de proteção". Se esses bytes forem perturbados por uma gravação de memória errante, as rotinas de diagnóstico podem relatar um problema. Se incluir a linha:

#define new DEBUG_NEW

No arquivo de implementação, todas as chamadas para new armazenarão o nome do arquivo e o número da linha onde a alocação de memória ocorreu. A função CMemoryState::D umpAllObjectsSince exibirá essas informações extras, permitindo que você identifique vazamentos de memória. Consulte também a classe CDumpContext para obter informações adicionais sobre a saída de diagnóstico.

Além disso, a biblioteca de tempo de execução C também suporta um conjunto de funções de diagnóstico que você pode usar para depurar seus aplicativos. Para obter mais informações, consulte Rotinas de depuração na Referência da Biblioteca Run-Time.

Macros de diagnóstico geral MFC

Designação Descrição
AFIRMAR Imprime uma mensagem e, em seguida, anula o programa se a expressão especificada for avaliada como FALSE na versão de depuração da biblioteca.
ASSERT_KINDOF Testa se um objeto é um objeto da classe especificada ou de uma classe derivada da classe especificada.
ASSERT_VALID Testa a validade interna de um objeto chamando sua função de membro AssertValid; normalmente substituído de CObject.
DEBUG_NEW Fornece um nome de arquivo e um número de linha para todas as alocações de objetos no modo de depuração para ajudar a encontrar vazamentos de memória.
DEBUG_ONLY Semelhante a ASSERT, mas não testa o valor da expressão; útil para código que deve ser executado apenas no modo de depuração.
GARANTIR e ENSURE_VALID Use para validar a correção dos dados.
THIS_FILE Expande para o nome do arquivo que está sendo compilado.
TRACE Fornece printfrecurso semelhante na versão de depuração da biblioteca.
VERIFICAR Semelhante a ASSERT, mas avalia a expressão na versão Release da biblioteca, bem como na versão Debug.

Variáveis e funções diagnósticas gerais do MFC

Designação Descrição
afxDump Variável global que envia CDumpContext informações para a janela de saída do depurador ou para o terminal de depuração.
afxMemDF Variável global que controla o comportamento do alocador de memória de depuração.
AfxCheckError Variável global usada para testar o SCODE passado para ver se é um erro e, em caso afirmativo, lança o erro apropriado.
AfxCheckMemory Verifica a integridade de toda a memória alocada no momento.
AfxDebugBreak Provoca uma quebra na execução.
AfxDump Se chamado enquanto estiver no depurador, despeja o estado de um objeto durante a depuração.
AfxDump Função interna que despeja o estado de um objeto durante a depuração.
AfxDumpStack Gere uma imagem da pilha atual. Esta função está sempre ligada estaticamente.
AfxEnableMemoryLeakDump Habilita o despejo de vazamento de memória.
AfxEnableMemoryTracking Ativa e desativa o rastreamento de memória.
AfxIsMemoryBlock Verifica se um bloco de memória foi alocado corretamente.
AfxIsValidAddress Verifica se um intervalo de endereços de memória está dentro dos limites do programa.
AfxIsValidString Determina se um ponteiro para uma cadeia de caracteres é válido.
AfxSetAllocHook Permite a chamada de uma função em cada alocação de memória.

Funções de diagnóstico de objeto MFC

Designação Descrição
AfxDoForAllClasses Executa uma função especificada em todas as classes derivadas do CObjectque oferecem suporte à verificação de tipo em tempo de execução.
AfxDoForAllObjects Executa uma função especificada em todos os objetos derivados do CObjectque foram alocados com new.

Macros de compilação MFC

Designação Descrição
_AFX_SECURE_NO_WARNINGS Suprime avisos do compilador para o uso de funções MFC preteridas.

_AFX_SECURE_NO_WARNINGS

Suprime avisos do compilador para o uso de funções MFC preteridas.

Sintaxe

_AFX_SECURE_NO_WARNINGS

Exemplo

Este exemplo de código causa um aviso do compilador se _AFX_SECURE_NO_WARNINGS não estiver definido.

// define this before including any afx files in *pch.h* (*stdafx.h* in Visual Studio 2017 and earlier)
#define _AFX_SECURE_NO_WARNINGS

// . . .

CRichEditCtrl* pRichEdit = new CRichEditCtrl;
pRichEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,
   CRect(10,10,100,200), pParentWnd, 1);
char sz[256];
pRichEdit->GetSelText(sz);

AfxDebugBreak

Chame essa função para causar uma quebra (no local da chamada para AfxDebugBreak) na execução da versão de depuração do seu aplicativo MFC.

Sintaxe

void AfxDebugBreak();

Comentários

AfxDebugBreak não tem efeito nas versões de lançamento de um aplicativo MFC e deve ser removido. Esta função só deve ser usada em aplicações MFC. Use a versão da API do Win32, DebugBreak, para causar uma quebra em aplicativos não-MFC.

Requerimentos

Cabeçalho: afxver_.h

AFIRMAR

Avalia o seu argumento.

ASSERT(booleanExpression)

Parâmetros

booleanExpression
Especifica uma expressão (incluindo valores de ponteiro) que é avaliada como diferente de zero ou 0.

Comentários

Se o resultado for 0, a macro imprime uma mensagem de diagnóstico e anula o programa. Se a condição for diferente de zero, não faz nada.

A mensagem de diagnóstico tem o formulário

assertion failed in file <name> in line <num>

onde nome é o nome do arquivo de origem e num é o número da linha da asserção que falhou no arquivo de origem.

Na versão Release do MFC, ASSERT não avalia a expressão e, portanto, não interromperá o programa. Se a expressão deve ser avaliada independentemente do ambiente, use a macro VERIFY no lugar de ASSERT.

Observação

Esta função está disponível apenas na versão de depuração do MFC.

Exemplo

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(pcage != NULL);
ASSERT(pcage->IsKindOf(RUNTIME_CLASS(CAge)));
// Terminates program only if pcage is NOT a CAge*.   

Requerimentos

Cabeçalho: afx.h

ASSERT_KINDOF

Essa macro afirma que o objeto apontado é um objeto da classe especificada ou é um objeto de uma classe derivada da classe especificada.

ASSERT_KINDOF(classname, pobject)

Parâmetros

nome de classe
O nome de uma classe derivada de CObject.

pobject
Um ponteiro para um objeto de classe.

Comentários

O parâmetro pobject deve ser um ponteiro para um objeto e pode ser const. O objeto apontado e a classe devem suportar CObject informações de classe em tempo de execução. Por exemplo, para garantir que pDocument seja um ponteiro para um objeto da classe CMyDoc, ou qualquer uma de suas derivadas, você pode codificar:

ASSERT_KINDOF(CMyDoc, pDocument);

Usar a macro ASSERT_KINDOF é exatamente o mesmo que codificar:

ASSERT(pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));

Esta função funciona apenas para classes declaradas com a macro DECLARE_DYNAMIC ou DECLARE_SERIAL.

Observação

Esta função está disponível apenas na versão de depuração do MFC.

Requerimentos

Cabeçalho: afx.h

ASSERT_VALID

Use para testar suas suposições sobre a validade do estado interno de um objeto.

ASSERT_VALID(pObject)

Parâmetros

pObject
Especifica um objeto de uma classe derivada de CObject que tem uma versão de substituição da função de membro AssertValid.

Comentários

ASSERT_VALID chama a função de membro AssertValid do objeto passado como seu argumento.

Na versão Release do MFC, ASSERT_VALID não faz nada. Na versão Debug, ele valida o ponteiro, verifica NULL e chama as próprias funções de membro AssertValid do objeto. Se algum desses testes falhar, uma mensagem de alerta será exibida da mesma maneira que ASSERT.

Observação

Esta função está disponível apenas na versão de depuração do MFC.

Para obter mais informações e exemplos, consulte Debugging MFC Applications.

Exemplo

// Assure that pMyObject is a valid pointer to an
// object derived from CObject.
ASSERT_VALID(pMyObject);

Requerimentos

Cabeçalho: afx.h

DEBUG_NEW

Ajuda a encontrar fugas de memória.

#define new DEBUG_NEW

Comentários

Você pode usar DEBUG_NEW em qualquer lugar do seu programa que normalmente usaria o operador new para alocar armazenamento de pilha.

No modo de depuração (quando o símbolo _DEBUG é definido), DEBUG_NEW controla o nome do arquivo e o número da linha para cada objeto que aloca. Em seguida, quando você usa o CMemoryState::D umpAllObjectsSince função de membro, cada objeto alocado com DEBUG_NEW é mostrado com o nome do arquivo e o número da linha onde foi alocado.

Para usar DEBUG_NEW, insira a seguinte diretiva em seus arquivos de origem:

#define new DEBUG_NEW

Depois de inserir esta diretiva, o pré-processador irá inseri-DEBUG_NEW onde quer que você use new, e MFC faz o resto. Quando você compila uma versão de lançamento do seu programa, DEBUG_NEW resolve para uma operação de new simples, e as informações de nome de arquivo e número de linha não são geradas.

Observação

Em versões anteriores do MFC (4.1 e anteriores), você precisava colocar a instrução #define depois de todas as instruções que chamavam as macros IMPLEMENT_DYNCREATE ou IMPLEMENT_SERIAL. Isso não é mais necessário.

Requerimentos

Cabeçalho: afx.h

DEBUG_ONLY

No modo de depuração (quando o símbolo _DEBUG é definido), DEBUG_ONLY avalia seu argumento.

DEBUG_ONLY(expression)

Comentários

Em uma compilação de versão, DEBUG_ONLY não avalia seu argumento. Isso é útil quando você tem um código que deve ser executado somente em compilações de depuração.

A macro DEBUG_ONLY é equivalente a cercar expressão com #ifdef _DEBUG e #endif.

Exemplo

void ExampleFunc(char* p, int size, char fill)
{
   char* q;               // working copy of pointer 
   VERIFY(q = p);         // copy buffer pointer and validate
   ASSERT(size >= 100);   // make sure buffer is at least 100 bytes
   ASSERT(isalpha(fill)); // make sure fill character is alphabetic
   // if fill character is invalid, substitute 'X' so we can continue
   // debugging after the preceding ASSERT fails.
   DEBUG_ONLY(fill = (isalpha(fill)) ? fill : 'X');
}

Requerimentos

Cabeçalho: afx.h

GARANTIR e ENSURE_VALID

Use para validar a correção dos dados.

Sintaxe

ENSURE(booleanExpression)
ENSURE_VALID(booleanExpression)

Parâmetros

booleanExpression
Especifica uma expressão booleana a ser testada.

Comentários

O objetivo dessas macros é melhorar a validação de parâmetros. As macros impedem o processamento adicional de parâmetros incorretos em seu código. Ao contrário das macros ASSERT, as macros ENSURE lançam uma exceção além de gerar uma asserção.

As macros se comportam de duas maneiras, de acordo com a configuração do projeto. As macros chamam ASSERT e, em seguida, lançam uma exceção se a asserção falhar. Assim, em configurações de depuração (ou seja, onde _DEBUG é definido) as macros produzem uma asserção e exceção, enquanto nas configurações de versão, as macros produzem apenas a exceção (ASSERT não avalia a expressão em configurações de versão).

A macro ENSURE_ARG age como a macro SURE.

ENSURE_VALID chama a macro ASSERT_VALID (que tem um efeito somente em compilações de depuração). Além disso, ENSURE_VALID lança uma exceção se o ponteiro for NULL. O teste NULL é executado nas configurações Debug e Release.

Se qualquer um desses testes falhar, uma mensagem de alerta será exibida da mesma maneira que ASSERT. A macro lança uma exceção de argumento inválido, se necessário.

Requerimentos

Cabeçalho: afx.h

THIS_FILE

Expande para o nome do arquivo que está sendo compilado.

Sintaxe

THIS_FILE

Comentários

As informações são usadas pelas macros ASSERT e VERIFY. O Assistente de aplicativo e os assistentes de código colocam a macro em arquivos de código-fonte que eles criam.

Exemplo

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// __FILE__ is one of the six predefined ANSI C macros that the
// compiler recognizes.

Requerimentos

Cabeçalho: afx.h

RASTREIO

Envia a cadeia de caracteres especificada para o depurador do aplicativo atual.

TRACE(exp)
TRACE(DWORD category, UINT level, LPCSTR lpszFormat, ...)

Comentários

Consulte ATLTRACE2 para obter uma descrição do TRACE. TRACE e ATLTRACE2 têm o mesmo comportamento.

Na versão de depuração do MFC, essa macro envia a cadeia de caracteres especificada para o depurador do aplicativo atual. Em uma compilação de versão, essa macro não é compilada para nada (nenhum código é gerado).

Para obter mais informações, consulte Debugging MFC Applications.

Requerimentos

Cabeçalho: afx.h

VERIFICAR

Na versão Debug do MFC, avalia seu argumento.

VERIFY(booleanExpression)

Parâmetros

booleanExpression
Especifica uma expressão (incluindo valores de ponteiro) que é avaliada como diferente de zero ou 0.

Comentários

Se o resultado for 0, a macro imprime uma mensagem de diagnóstico e interrompe o programa. Se a condição for diferente de zero, não faz nada.

A mensagem de diagnóstico tem o formulário

assertion failed in file <name> in line <num>

onde nome é o nome do arquivo de origem e num é o número da linha da asserção que falhou no arquivo de origem.

Na versão Release do MFC, VERIFY avalia a expressão, mas não imprime ou interrompe o programa. Por exemplo, se a expressão for uma chamada de função, a chamada será feita.

Exemplo

// VERIFY can be used for things that should never fail, though
// you may want to make sure you can provide better error recovery
// if the error can actually cause a crash in a production system.

// It _is_ possible that GetDC() may fail, but the out-of-memory
// condition that causes it isn't likely. For a test application,
// this use of VERIFY() is fine. For any production code, this
// usage is dubious.

// get the display device context
HDC hdc;
VERIFY((hdc = ::GetDC(hwnd)) != NULL);

// give the display context back
::ReleaseDC(hwnd, hdc);

Requerimentos

Cabeçalho: afx.h

afxDump (CDumpContext no MFC)

Fornece capacidade básica de despejo de objeto em seu aplicativo.

CDumpContext afxDump;

Comentários

afxDump é um objeto CDumpContext predefinido que permite enviar informações CDumpContext para a janela de saída do depurador ou para um terminal de depuração. Normalmente, você fornece afxDump como um parâmetro para CObject::Dump.

Em Windows NT e todas as versões do Windows, afxDump saída é enviada para a janela Output-Debug do Visual C++ quando você depurar seu aplicativo.

Essa variável é definida somente na versão de depuração do MFC. Para obter mais informações sobre afxDump, consulte Debugging MFC Applications.

Exemplo

// example for afxDump
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//..
// now dump the contents
#ifdef _DEBUG
afxDump << _T("Dumping myPerson:\n");
pMyPerson->Dump(afxDump);
afxDump << _T("\n");
#endif

Requerimentos

Cabeçalho: afx.h

AfxDump (Interno)

Função interna que MFC usa para despejar o estado de um objeto durante a depuração.

Sintaxe

void AfxDump(const CObject* pOb);

Parâmetros

pOb
Um ponteiro para um objeto de uma classe derivada de CObject.

Comentários

AfxDump chama a função de membro Dump de um objeto e envia as informações para o local especificado pela variável afxDump. AfxDump está disponível apenas na versão de depuração do MFC.

Seu código de programa não deve chamar AfxDump, mas deve chamar a função de membro Dump do objeto apropriado.

Requerimentos

Cabeçalho: afx.h

afxMemDF

Esta variável é acessível a partir de um depurador ou do seu programa e permite-lhe ajustar o diagnóstico de alocação.

int afxMemDF;

Comentários

afxMemDF pode ter os seguintes valores, conforme especificado pelo afxMemDFde enumeração:

  • allocMemDF Ativa o alocador de depuração (configuração padrão na biblioteca de depuração).

  • delayFreeMemDF Atrasa a liberação de memória. Enquanto o programa libera um bloco de memória, o alocador não retorna essa memória para o sistema operacional subjacente. Isso colocará o máximo de estresse de memória em seu programa.

  • checkAlwaysMemDF Chamadas AfxCheckMemory sempre que a memória é alocada ou liberada. Isso diminuirá significativamente as alocações de memória e os deallocations.

Exemplo

afxMemDF = allocMemDF | checkAlwaysMemDF;

Requerimentos

Cabeçalho: afx.h

AfxCheckError

Esta função testa o SCODE passado para ver se é um erro.

void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryException*
throw COleException*

Comentários

Se for um erro, a função lança uma exceção. Se o SCODE passado for E_OUTOFMEMORY, a função lançará um CMemoryException chamando AfxThrowMemoryException. Caso contrário, a função lança um COleException chamando AfxThrowOleException.

Esta função pode ser usada para verificar os valores de retorno de chamadas para funções OLE em seu aplicativo. Ao testar o valor de retorno com essa função em seu aplicativo, você pode reagir adequadamente às condições de erro com uma quantidade mínima de código.

Observação

Esta função tem o mesmo efeito em compilações de depuração e não-depuração.

Exemplo

AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
   IID_IDispatch, (LPVOID*)& pWMPDispatch));

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Requerimentos

Cabeçalho: afx.h

AfxCheckMemory

Esta função valida o pool de memória livre e imprime mensagens de erro conforme necessário.

BOOL AfxCheckMemory();

Valor de retorno

Diferente de zero se não houver erros de memória; caso contrário, 0.

Comentários

Se a função não detetar nenhuma corrupção de memória, ela não imprimirá nada.

Todos os blocos de memória atualmente alocados na pilha são verificados, incluindo aqueles alocados por new mas não aqueles alocados por chamadas diretas para alocadores de memória subjacentes, como a função malloc ou a função GlobalAlloc Windows. Se algum bloco for encontrado corrompido, uma mensagem será impressa na saída do depurador.

Se você incluir a linha

#define new DEBUG_NEW

Em um módulo de programa, as chamadas subsequentes para AfxCheckMemory mostram o nome do arquivo e o número da linha onde a memória foi alocada.

Observação

Se o módulo contiver uma ou mais implementações de classes serializáveis, você deverá colocar a linha #define após a última chamada de macro IMPLEMENT_SERIAL.

Esta função funciona apenas na versão de depuração do MFC.

Exemplo

CAge* pcage = new CAge(21);  // CAge is derived from CObject.
Age* page = new Age(22);     // Age is NOT derived from CObject.
*(((char*)pcage) - 1) = 99;   // Corrupt preceding guard byte
*(((char*)page) - 1) = 99;    // Corrupt preceding guard byte
AfxCheckMemory();

Requerimentos

Cabeçalho: afx.h

AfxDump (MFC)

Chame essa função enquanto estiver no depurador para despejar o estado de um objeto durante a depuração.

void AfxDump(const CObject* pOb);

Parâmetros

pOb
Um ponteiro para um objeto de uma classe derivada de CObject.

Comentários

AfxDump chama a função de membro Dump de um objeto e envia as informações para o local especificado pela variável afxDump. AfxDump está disponível apenas na versão de depuração do MFC.

Seu código de programa não deve chamar AfxDump, mas deve chamar a função de membro Dump do objeto apropriado.

Requerimentos

Cabeçalho: afx.h

AfxDumpStack

Esta função global pode ser usada para gerar uma imagem da pilha atual.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Parâmetros

dwTarget
Indica o destino da saída de dump. Os valores possíveis, que podem ser combinados usando o operador bitwise-OR (|), são os seguintes:

  • AFX_STACK_DUMP_TARGET_TRACE Envia a saída por meio da macro TRACE. A macro TRACE gera saída somente em compilações de depuração; ele não gera nenhuma saída em compilações de versão. Além disso, TRACE pode ser redirecionado para outros destinos além do depurador.

  • AFX_STACK_DUMP_TARGET_DEFAULT Envia a saída de despejo para o destino padrão. Para uma compilação de depuração, a saída vai para a macro TRACE. Em uma compilação de versão, a saída vai para a área de transferência.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD Envia a saída apenas para a Área de Transferência. Os dados são colocados na área de transferência como texto sem formatação usando o formato CF_TEXT área de transferência.

  • AFX_STACK_DUMP_TARGET_BOTH Envia a saída para a área de transferência e para a macro TRACE, simultaneamente.

  • AFX_STACK_DUMP_TARGET_ODS Envia a saída diretamente para o depurador por meio da função Win32 OutputDebugString(). Essa opção gerará a saída do depurador nas compilações de depuração e versão quando um depurador for anexado ao processo. AFX_STACK_DUMP_TARGET_ODS sempre chega ao depurador (se estiver anexado) e não pode ser redirecionada.

Comentários

O exemplo abaixo reflete uma única linha da saída gerada a partir da chamada AfxDumpStack de um manipulador de botões em um aplicativo de diálogo MFC:

=== begin AfxDumpStack output ===
00427D55: DUMP2\DEBUG\DUMP2.EXE! void AfxDumpStack(unsigned long) + 181 bytes
0040160B: DUMP2\DEBUG\DUMP2.EXE! void CDump2Dlg::OnClipboard(void) + 14 bytes
0044F884: DUMP2\DEBUG\DUMP2.EXE! int _AfxDispatchCmdMsg(class CCmdTarget *,
unsigned int,int,void ( CCmdTarget::*)(void),void *,unsigned int,struct
AFX_CMDHANDLE
0044FF7B: DUMP2\DEBUG\DUMP2.EXE! virtual int CCmdTarget::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 626 bytes
00450C71: DUMP2\DEBUG\DUMP2.EXE! virtual int CDialog::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 36 bytes
00455B27: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnCommand(unsigned
int,long) + 312 bytes
00454D3D: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) + 83 bytes
00454CC0: DUMP2\DEBUG\DUMP2.EXE! virtual long CWnd::WindowProc(unsigned
int,unsigned int,long) + 46 bytes
004528D9: DUMP2\DEBUG\DUMP2.EXE! long AfxCallWndProc(class CWnd *,struct
HWND__ *,unsigned int,unsigned int,long) + 237 bytes
00452D34: DUMP2\DEBUG\DUMP2.EXE! long AfxWndProc(struct HWND__ *,unsigned
int,unsigned int,long) + 129 bytes
BFF73663: WINDOWS\SYSTEM\KERNEL32.DLL! ThunkConnect32 + 2148 bytes
BFF928E0: WINDOWS\SYSTEM\KERNEL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===

Cada linha na saída acima indica o endereço da última chamada de função, o nome completo do caminho do módulo que contém a chamada de função e o protótipo de função chamado. Se a chamada de função na pilha não acontecer no endereço exato da função, um deslocamento de bytes será mostrado.

Por exemplo, a tabela a seguir descreve a primeira linha da saída acima:

Realização Descrição
00427D55: O endereço de retorno da última chamada de função.
DUMP2\DEBUG\DUMP2.EXE! O nome completo do caminho do módulo que contém a chamada de função.
void AfxDumpStack(unsigned long) O protótipo da função chamado.
+ 181 bytes O deslocamento em bytes do endereço do protótipo da função (neste caso, void AfxDumpStack(unsigned long)) para o endereço de retorno (neste caso, 00427D55).

AfxDumpStack está disponível em versões de depuração e não depuração das bibliotecas MFC; no entanto, a função é sempre vinculada estaticamente, mesmo quando o arquivo executável usa MFC em uma DLL compartilhada. Em implementações de biblioteca compartilhada, a função é encontrada no MFCS42. Biblioteca LIB (e suas variantes).

Para usar esta função com êxito:

  • O arquivo IMAGEHLP.DLL deve estar no seu caminho. Se você não tiver essa DLL, a função exibirá uma mensagem de erro. Consulte Biblioteca de Ajuda de Imagem para obter informações sobre o conjunto de funções fornecido pelo IMAGEHLP.

  • Os módulos que têm quadros na pilha devem incluir informações de depuração. Se eles não contiverem informações de depuração, a função ainda gerará um rastreamento de pilha, mas o rastreamento será menos detalhado.

Requerimentos

Cabeçalho: afx.h

AfxEnableMemoryLeakDump

Habilita e desabilita o despejo de vazamento de memória no AFX_DEBUG_STATE destruidor.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Parâmetros

bDump
[em] TRUE indica que o despejo de vazamento de memória está habilitado; FALSE indica que o despejo de vazamento de memória está desativado.

Valor de retorno

O valor anterior para este sinalizador.

Comentários

Quando um aplicativo descarrega a biblioteca MFC, a biblioteca MFC verifica se há vazamentos de memória. Neste ponto, quaisquer vazamentos de memória são relatados ao usuário por meio da janela Debug do Visual Studio.

Se seu aplicativo carregar outra biblioteca antes da biblioteca MFC, algumas alocações de memória nessa biblioteca serão relatadas incorretamente como vazamentos de memória. Vazamentos de memória falsos podem fazer com que seu aplicativo feche lentamente à medida que a biblioteca MFC os relata. Nesse caso, use AfxEnableMemoryLeakDump para desativar o despejo de vazamento de memória.

Observação

Se você usar esse método para desativar o despejo de vazamento de memória, você não receberá relatórios de vazamentos de memória válidos em seu aplicativo. Você só deve usar esse método se tiver certeza de que o relatório de vazamento de memória contém vazamentos de memória falsos.

Requerimentos

Cabeçalho: afx.h

AfxEnableMemoryTracking

O rastreamento de memória de diagnóstico normalmente é ativado na versão de depuração do MFC.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Parâmetros

bTrack
Definir esse valor como TRUE ativa o rastreamento de memória; FALSO desliga-o.

Valor de retorno

A configuração anterior do sinalizador tracking-enable (ativação de rastreamento).

Comentários

Use esta função para desativar o rastreamento em seções do seu código que você sabe que estão alocando blocos corretamente.

Para obter mais informações sobre AfxEnableMemoryTracking, consulte Debugging MFC Applications.

Observação

Esta função funciona apenas na versão de depuração do MFC.

Exemplo

BOOL CMyWinApp::InitInstance()
{
#ifdef _DEBUG
   // Disable tracking of memory for the scope of the InitInstance()
   AfxEnableMemoryTracking(FALSE);
#endif  // _DEBUG

   // ...

#ifdef _DEBUG
   // Re-enable tracking of memory
   AfxEnableMemoryTracking(TRUE);
#endif  // _DEBUG

   return TRUE;
}

Requerimentos

Cabeçalho: afx.h

AfxIsMemoryBlock

Testa um endereço de memória para certificar-se de que ele representa um bloco de memória atualmente ativo que foi alocado pela versão de diagnóstico do new.

BOOL AfxIsMemoryBlock(
    const void* p,
    UINT nBytes,
    LONG* plRequestNumber = NULL);

Parâmetros

p
Aponta para o bloco de memória a ser testado.

nBytes
Contém o comprimento do bloco de memória em bytes.

plRequestNumber
Aponta para um inteiro long que será preenchido com o número de sequência de alocação do bloco de memória, ou zero se ele não representar um bloco de memória ativo no momento.

Valor de retorno

Diferente de zero se o bloco de memória estiver alocado no momento e o comprimento estiver correto; caso contrário, 0.

Comentários

Ele também verifica o tamanho especificado em relação ao tamanho alocado original. Se a função retornar diferente de zero, o número de sequência de alocação será retornado em plRequestNumber. Este número representa a ordem pela qual o bloco foi alocado em relação a todas as outras alocações de new.

Exemplo

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(AfxIsMemoryBlock(pcage, sizeof(CAge)));

Requerimentos

Cabeçalho: afx.h

AfxIsValidAddress

Testa qualquer endereço de memória para garantir que ele esteja contido inteiramente no espaço de memória do programa.

BOOL AfxIsValidAddress(
    const void* lp,
    UINT nBytes,
    BOOL bReadWrite = TRUE);

Parâmetros

lp
Aponta para o endereço de memória a ser testado.

nBytes
Contém o número de bytes de memória a serem testados.

bReadWrite
Especifica se a memória é para leitura e escrita (TRUE) ou apenas leitura (FALSE).

Valor de retorno

Em compilações de depuração, diferente de zero se o bloco de memória especificado estiver contido inteiramente no espaço de memória do programa; caso contrário, 0.

Em compilações sem depuração, não zero se lp não for NULL; caso contrário, 0.

Comentários

O endereço não se restringe aos blocos alocados por new.

Exemplo

// Allocate a 5 character array, which should have a valid memory address.
char* arr = new char[5];

// Create a null pointer, which should be an invalid memory address.
char* null = (char*)0x0;

ASSERT(AfxIsValidAddress(arr, 5));
ASSERT(!AfxIsValidAddress(null, 5));

Requerimentos

Cabeçalho: afx.h

AfxIsValidString

Use esta função para determinar se um ponteiro para uma cadeia de caracteres é válido.

BOOL AfxIsValidString(
    LPCSTR lpsz,
    int nLength = -1);

Parâmetros

lpsz
O ponteiro para testar.

nComprimento
Especifica o comprimento da cadeia de caracteres a ser testada, em bytes. Um valor de -1 indica que a cadeia de caracteres será terminada em nulo.

Valor de retorno

Em compilações de depuração, diferente de zero se o ponteiro especificado apontar para uma cadeia de caracteres do tamanho especificado; caso contrário, 0.

Em compilações não-depuração, não zero se lpsz não for NULL; caso contrário, 0.

Exemplo

// Create a character string which should be valid.
char str[12] = "hello world";

// Create a null pointer, which should be an invalid string.
char* null = (char*)0x0;

ASSERT(AfxIsValidString(str, 12));
ASSERT(!AfxIsValidString(null, 5));

Requerimentos

Cabeçalho: afx.h

AfxSetAllocHook

Define um gancho que permite chamar a função especificada antes que cada bloco de memória seja alocado.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Parâmetros

pfnAllocHook
Especifica o nome da função a ser chamada. Consulte as Observações para o protótipo de uma função de alocação.

Valor de retorno

Diferente de zero se você quiser permitir a alocação; caso contrário, 0.

Comentários

O alocador de memória de depuração da Microsoft Foundation Class Library pode chamar uma função de gancho definida pelo usuário para permitir que o usuário monitore uma alocação de memória e controle se a alocação é permitida. As funções do gancho de alocação são prototipadas da seguinte forma:

BOOL AFXAPI AllocHook( size_tnSize, BOOLbObject, LONGlRequestNumber);

nTamanho
O tamanho da alocação de memória proposta.

bObject
TRUE se a alocação for para um objeto derivado de CObject; caso contrário, FALSE.

lRequestNumber
O número de sequência da alocação de memória.

Observe que a convenção de chamada AFXAPI implica que o destinatário deve remover os parâmetros da pilha.

Requerimentos

Cabeçalho: afx.h

AfxDoForAllClasses

Chama a função de iteração especificada para todas as classes derivadas de CObjectserializáveis no espaço de memória do aplicativo.

void
AFXAPI AfxDoForAllClasses(
    void (* pfn)(const CRuntimeClass* pClass, void* pContext),
    void* pContext);

Parâmetros

pfn
Aponta para uma função de iteração a ser chamada para cada classe. Os argumentos de função são um ponteiro para um objeto CRuntimeClass e um ponteiro vazio para dados extras que o chamador fornece à função.

pContext
Aponta para dados opcionais que o chamador pode fornecer para a função de iteração. Este ponteiro pode ser NULL.

Comentários

As classes serializáveis CObjectderivadas são classes derivadas usando a macro DECLARE_SERIAL. O ponteiro que é passado para AfxDoForAllClasses em pContext é passado para a função de iteração especificada cada vez que é chamado.

Observação

Esta função funciona apenas na versão de depuração do MFC.

Exemplo

#ifdef _DEBUG
void DoForAllClasses(const CRuntimeClass* pClass, void* pContext)
{
   ASSERT(pContext != NULL);
   CString* pStr = (CString*)pContext;

   *pStr += pClass->m_lpszClassName;
   *pStr += _T("\n");
}
#endif

 

#ifdef _DEBUG
CString cStr;
AfxDoForAllClasses(DoForAllClasses, &cStr);
AfxMessageBox(cStr);
#endif

Requerimentos

Cabeçalho: afx.h

AfxDoForAllObjects

Executa a função de iteração especificada para todos os objetos derivados de CObject que foram alocados com new.

void AfxDoForAllObjects(
    void (* pfn)(CObject* pObject, void* pContext),
    void* pContext);

Parâmetros

pfn
Aponta para uma função de iteração a ser executada para cada objeto. Os argumentos da função são um ponteiro para um CObject e um ponteiro vazio para dados extras que o chamador fornece à função.

pContext
Aponta para dados opcionais que o chamador pode fornecer para a função de iteração. Este ponteiro pode ser NULL.

Comentários

Objetos de pilha, globais ou incorporados não são enumerados. O ponteiro passado para AfxDoForAllObjects em pContext é passado para a função de iteração especificada cada vez que é chamado.

Observação

Esta função funciona apenas na versão de depuração do MFC.

Exemplo

#ifdef _DEBUG
void DoForAllObjects(CObject* pObject, void* pContext)
{
   int* pnCount = (int*)pContext;

   pObject->AssertValid();
   if (pnCount != NULL)
      (*pnCount)++;
}
#endif // _DEBUG

 

#ifdef _DEBUG
//AfxDoForAllObjects will call the function DoForAllObjects 
//For each CObject-derived object that is allocated on the heap
int nCount = 0;
AfxDoForAllObjects(DoForAllObjects, &nCount);
TRACE("%d Objects Checked\n", nCount);
#endif

Ver também

Macros e Globais
CObject::D ump