CDumpContext 类

支持面向流并使用可读文本格式的诊断输出。

语法

class CDumpContext

成员

公共构造函数

名称 描述
CDumpContext::CDumpContext 构造 CDumpContext 对象。

公共方法

名称 描述
CDumpContext::DumpAsHex 以十六进制格式转储指示的项。
CDumpContext::Flush 刷新转储上下文缓冲区中的任何数据。
CDumpContext::GetDepth 获取对应于转储深度的整数。
CDumpContext::HexDump 以十六进制格式转储数组中包含的字节。
CDumpContext::SetDepth 设置转储的深度。

公共运算符

“属性” 描述
CDumpContext::operator << 将变量和对象插入转储上下文。

注解

CDumpContext 没有基类。

对于大部分转储,可以使用预声明的 CDumpContext 对象 - afxDumpafxDump 对象仅在 Microsoft 基础类库的调试版本中可用。

一些内存诊断服务为其输出使用 afxDump

在 Windows 环境中,预定义 afxDump 对象的输出(在概念上类似于 cerr 流)通过 Windows 函数 OutputDebugString 路由到调试器。

对于转储对象数据的 CObject 指针,CDumpContext 类具有重载的插入 (<<) 运算符。 如果需要派生对象的自定义转储格式,请重写 CObject::Dump。 大多数 Microsoft 基础类会实现重写 Dump 成员函数。

非派生自 CObject 的类(例如 CStringCTimeCTimeSpan)有自己的重载 CDumpContext 插入运算符,常用的结构也是这样,例如 CFileStatusCPointCRect

如果在类的实现中使用 IMPLEMENT_DYNAMICIMPLEMENT_SERIAL 宏,则 CObject::Dump 打印派生自 CObject 的类的名称。 否则打印 CObject

CDumpContext 类可用于库的调试版和发布版,但 Dump 成员函数仅在调试版中定义。 使用 #ifdef _DEBUG / #endif 语句将诊断代码括起来,包括自定义 Dump 成员函数

创建自己的 CDumpContext 对象之前,必须创建充当转储目标的 CFile 对象。

有关 CDumpContext 的详细信息,请参阅调试 MFC 应用程序

#define _DEBUG

继承层次结构

CDumpContext

要求

标头: afx.h

CDumpContext::CDumpContext

构造 CDumpContext 类的对象。

CDumpContext(CFile* pFile = NULL);

参数

pFile
指向转储目标 - CFile 对象的指针。

备注

afxDump 对象是自动构造的。

转储上下文处于活动状态时不要写入基础 CFile,否则将干扰转储。 在 Windows 环境中,输出通过 Windows 函数 OutputDebugString 路由到调试器。

示例

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

转储格式为十六进制数字的指定类型。

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);

返回值

CDumpContext 对象的引用。

注解

调用此成员函数以十六进制数字的格式转储指定类型的项。 若要转储数组,请调用 CDumpContext::HexDump

示例

#if _DEBUG
afxDump.DumpAsHex(115);
#endif

CDumpContext::Flush

强制将缓冲区中剩余的任何数据写入附加到转储上下文的文件。

void Flush();

示例

#if _DEBUG
afxDump.Flush();
#endif

CDumpContext::GetDepth

确定进行中的是深转储还是浅转储。

int GetDepth() const;

返回值

SetDepth 设置的转储深度。

示例

请参阅 SetDepth 的示例。

CDumpContext::HexDump

转储格式为十六进制数字的字节数组。

void HexDump(
    LPCTSTR lpszLine,
    BYTE* pby,
    int nBytes,
    int nWidth);

参数

lpszLine
要在新行开头输出的字符串。

pby
指向包含要转储字节的缓冲区的指针。

nBytes
要转储的字节数。

nWidth
每个行转储的最大字节数(不是输出行的宽度)。

注解

若要以十六进制数字格式转储单个特定项类型,请调用 CDumpContext::DumpAsHex

示例

#if _DEBUG
TCHAR test[] = _T("This is a test of CDumpContext::HexDump\n");
afxDump.HexDump(_T("."), (BYTE *)test, sizeof(test), 20);
#endif

CDumpContext::operator <<

将指定数据输出到转储上下文。

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);

返回值

CDumpContext 引用。 使用返回值可在单个源代码行上编写多个插入。

备注

CObject 指针和大多数基元类型重载插入运算符。 指向字符的指针会导致转储字符串内容;指向 void 的指针导致仅以十六进制格式转储地址。 LONGLONG 导致转储 64 位带符号整数;ULONGLONG 导致转储 64 位无符号整数。

如果在类的实现中使用 IMPLEMENT_DYNAMIC 或 IMPLEMENT_SERIAL 宏,则插入运算符(通过 CObject::Dump)打印派生自 CObject 的类的名称。 否则打印 CObject。 如果重写类的 Dump 函数,则可以提供更有意义的对象内容输出,而不是十六进制转储。

示例

#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

设置转储的深度。

void SetDepth(int nNewDepth);

参数

nNewDepth
新的深度值。

备注

如果要转储基元类型或者不包含指向其他对象指针的简单 CObject,则值为 0 就已足够。 大于 0 的值指定以递归方式转储所有对象的深转储。 例如,集合的深转储转储集合的所有元素。 可以在派生类中使用其他特定深度值。

注意

循环引用不会在深转储中检测到,并可能导致无限循环。

示例

#if _DEBUG
afxDump.SetDepth(1); // Specifies deep dump
ASSERT(afxDump.GetDepth() == 1);
#endif

另请参阅

层次结构图
CFile 类
CObject 类