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 printf recurso 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 CObject que oferecem suporte à verificação de tipo em tempo de execução. |
AfxDoForAllObjects | Executa uma função especificada em todos os objetos derivados do CObject que 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 afxMemDF
de 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
ChamadasAfxCheckMemory
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 CObject
serializá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 CObject
derivadas 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