Classe CDumpContext
Dá suporte à saída de diagnóstico orientada a fluxo na forma de texto legível por humanos.
Sintaxe
class CDumpContext
Membros
Construtores públicos
Nome | Descrição |
---|---|
CDumpContext::CDumpContext | Constrói um objeto CDumpContext . |
Métodos públicos
Nome | Descrição |
---|---|
CDumpContext::DumpAsHex | Despeja o item indicado no formato hexadecimal. |
CDumpContext::Flush | Libera todos os dados no buffer de contexto de despejo. |
CDumpContext::GetDepth | Obtém um inteiro correspondente à profundidade do despejo. |
CDumpContext::HexDump | Despeja bytes contidos em uma matriz no formato hexadecimal. |
CDumpContext::SetDepth | Define a profundidade do despejo. |
Operadores públicos
Nome | Descrição |
---|---|
CDumpContext::operator << |
Insere variáveis e objetos no contexto de despejo. |
Comentários
CDumpContext
não tem uma classe base.
Você pode usar afxDump, um objeto CDumpContext
pré-declarado, para a maior parte do despejo. O objeto afxDump
está disponível apenas na versão de depuração da biblioteca Microsoft Foundation Class.
Vários dos serviços de diagnóstico de memória usam afxDump
para sua saída.
No ambiente do Windows, a saída do objeto predefinido afxDump
, conceitualmente semelhante ao fluxo cerr
, é roteada para o depurador por meio da função do Windows OutputDebugString
.
A classe CDumpContext
tem um operador de inserção (<<) sobrecarregado para ponteiros CObject
que despejam os dados do objeto. Se você precisar de um formato de despejo personalizado para um objeto derivado, substitua CObject::Dump. A maioria das classes do Microsoft Foundation implementa uma função membro Dump
substituída.
Classes que não são derivadas de CObject
, como CString
, CTime
e CTimeSpan
, têm os próprios operadores de inserção sobrecarregados CDumpContext
, assim como estruturas frequentemente usadas, como CFileStatus
, CPoint
e CRect
.
Se você usar a macro IMPLEMENT_DYNAMIC ou IMPLEMENT_SERIAL na implementação da classe, CObject::Dump
imprimirá o nome da classe derivada de CObject
. Caso contrário, ele imprimirá CObject
.
A classe CDumpContext
está disponível com as versões Depuração e Versão da biblioteca, mas a função de membro Dump
é definida apenas na versão de depuração. Use instruções #ifdef _DEBUG / #endif
para colocar o código de diagnóstico entre colchetes, incluindo suas funções de membro Dump
personalizadas.
Antes de criar seu objeto CDumpContext
, crie um objeto CFile
que serve como destino de despejo.
Para obter mais informações sobre CDumpContext
, confira Como depurar aplicativos MFC.
#define _DEBUG
Hierarquia de herança
CDumpContext
Requisitos
Cabeçalho: afx.h
CDumpContext::CDumpContext
Constrói um objeto de classe CDumpContext
.
CDumpContext(CFile* pFile = NULL);
Parâmetros
pFile
Um ponteiro para o objeto CFile
que é o destino de despejo.
Comentários
O objeto afxDump
é construído automaticamente.
Não escreva no CFile
subjacente enquanto o contexto de despejo estiver ativo; caso contrário, você interferirá no despejo. No ambiente do Windows, a saída é roteada para o depurador por meio da função do Windows OutputDebugString
.
Exemplo
CFile f;
if (!f.Open(_T("dump.txt"), CFile::modeCreate | CFile::modeWrite))
{
AFXDUMP(_T("Unable to open file\n"));
exit(1);
}
CDumpContext dc(&f);
CDumpContext::DumpAsHex
Despeja o tipo especificado formatado como números hexadecimal.
CDumpContext& DumpAsHex(BYTE b);
CDumpContext& DumpAsHex(DWORD dw);
CDumpContext& DumpAsHex(int n);
CDumpContext& DumpAsHex(LONG l);
CDumpContext& DumpAsHex(LONGLONG n);
CDumpContext& DumpAsHex(UINT u);
CDumpContext& DumpAsHex(ULONGLONG n);
CDumpContext& DumpAsHex(WORD w);
Valor de retorno
Uma referência a um objeto CDumpContext
.
Comentários
Chame essa função de membro para despejar o item do tipo especificado como um número hexadecimal. Para despejar uma matriz, chame CDumpContext::HexDump.
Exemplo
#if _DEBUG
afxDump.DumpAsHex(115);
#endif
CDumpContext::Flush
Força os dados restantes em buffers a serem gravados no arquivo anexado ao contexto de despejo.
void Flush();
Exemplo
#if _DEBUG
afxDump.Flush();
#endif
CDumpContext::GetDepth
Determina se um despejo profundo ou raso está em processo.
int GetDepth() const;
Valor de retorno
A profundidade do despejo conforme definida por SetDepth
.
Exemplo
Confira o exemplo de SetDepth.
CDumpContext::HexDump
Despeja uma matriz de bytes formatados como números hexadecimal.
void HexDump(
LPCTSTR lpszLine,
BYTE* pby,
int nBytes,
int nWidth);
Parâmetros
lpszLine
Uma cadeia de caracteres a ser saída no início de uma nova linha.
pby
Um ponteiro para um buffer que contém os bytes a serem despejados.
nBytes
O número de bytes a serem despejados.
nWidth
Número máximo de bytes despejados por linha (não a largura da linha de saída).
Comentários
Para despejar um só tipo de item específico como um número hexadecimal, chame CDumpContext::DumpAsHex.
Exemplo
#if _DEBUG
TCHAR test[] = _T("This is a test of CDumpContext::HexDump\n");
afxDump.HexDump(_T("."), (BYTE *)test, sizeof(test), 20);
#endif
CDumpContext::operator <<
Gera os dados especificados para o contexto de despejo.
CDumpContext& operator<<(const CObject* pOb);
CDumpContext& operator<<(const CObject& ob);
CDumpContext& operator<<(LPCTSTR lpsz);
CDumpContext& operator<<(const void* lp);
CDumpContext& operator<<(BYTE by);
CDumpContext& operator<<(WORD w);
CDumpContext& operator<<(DWORD dw);
CDumpContext& operator<<(int n);
CDumpContext& operator<<(double d);
CDumpContext& operator<<(float f);
CDumpContext& operator<<(LONG l);
CDumpContext& operator<<(UINT u);
CDumpContext& operator<<(LPCWSTR lpsz);
CDumpContext& operator<<(LPCSTR lpsz);
CDumpContext& operator<<(LONGLONG n);
CDumpContext& operator<<(ULONGLONG n);
CDumpContext& operator<<(HWND h);
CDumpContext& operator<<(HDC h);
CDumpContext& operator<<(HMENU h);
CDumpContext& operator<<(HACCEL h);
CDumpContext& operator<<(HFONT h);
Valor de retorno
Uma referência a CDumpContext
. Usando o valor retornado, você pode escrever várias inserções em uma só linha de código-fonte.
Comentários
O operador de inserção é sobrecarregado para ponteiros CObject
, bem como para a maioria dos tipos primitivos. Um ponteiro para caractere resulta em um despejo de conteúdo de cadeia de caracteres; um ponteiro para void
resulta em um despejo hexadecimal somente do endereço. Um LONGLONG resulta em um despejo de um inteiro com sinal de 64 bits; Um ULONGLONG resulta em um despejo de um inteiro sem sinal de 64 bits.
Se você usar a macro IMPLEMENT_DYNAMIC ou IMPLEMENT_SERIAL na implementação de sua classe, o operador de inserção, por meio CObject::Dump
, imprimirá o nome da classe derivada de CObject
. Caso contrário, ele imprimirá CObject
. Se você substituir a função Dump
da classe, poderá fornecer uma saída mais significativa do conteúdo do objeto em vez de um despejo hexadecimal.
Exemplo
#if _DEBUG
CStringList li;
li.AddHead(_T("item 0"));
li.AddHead(_T("item 1"));
CString s = _T("test");
int i = 7;
long lo = 1000000000L;
LONGLONG lolo = 12345678901234i64;
afxDump << _T("list=") << &li << _T("string=")
<< s << _T("int=") << i << _T("long=") << lo
<< _T("LONGLONG=") << lolo << _T("\n");
#endif
CDumpContext::SetDepth
Define a profundidade para o despejo.
void SetDepth(int nNewDepth);
Parâmetros
nNewDepth
O novo valor de profundidade.
Comentários
Se você estiver despejando um tipo primitivo ou simples CObject
que não contém ponteiros para outros objetos, um valor de 0 será suficiente. Um valor maior que 0 especifica um despejo profundo em que todos os objetos são despejados recursivamente. Por exemplo, um despejo profundo de uma coleção despejará todos os elementos da coleção. Você pode usar outros valores de profundidade específicos em suas classes derivadas.
Observação
Referências circulares não são detectadas em despejos profundos e podem resultar em loops infinitos.
Exemplo
#if _DEBUG
afxDump.SetDepth(1); // Specifies deep dump
ASSERT(afxDump.GetDepth() == 1);
#endif