Поделиться через


Класс CDumpContext

Поддерживает ориентированных на поток диагностические данные в форме человекочитаемого текста.

Синтаксис

class CDumpContext

Участники

Открытые конструкторы

Имя Описание
CDumpContext::CDumpContext Формирует объект CDumpContext.

Открытые методы

Имя Описание
CDumpContext::D umpAsHex Дамп указанного элемента в шестнадцатеричном формате.
CDumpContext::Flush Очищает все данные в буфере контекста дампа.
CDumpContext::GetDepth Возвращает целое число, соответствующее глубине дампа.
CDumpContext::HexDump Дампы байтов, содержащихся в массиве в шестнадцатеричном формате.
CDumpContext::SetDepth Задает глубину дампа.

Открытые операторы

Имя Описание
CDumpContext::operator << Вставляет переменные и объекты в контекст дампа.

Замечания

CDumpContext не имеет базового класса.

Для большинства дампов можно использовать afxDump, предварительно объявленный CDumpContext объект. Объект afxDump доступен только в отладочной версии библиотеки классов Microsoft Foundation.

Несколько служб диагностики памяти, используемых afxDump для их выходных данных.

В среде Windows выходные данные предопределенного afxDump объекта, концептуально похожие cerr на поток, направляются в отладчик через функцию OutputDebugStringWindows.

Класс CDumpContext имеет перегруженный оператор вставки ( <<) для CObject указателей, которые сбрасывают данные объекта. Если вам нужен пользовательский формат дампа для производного объекта, переопределите CObject::D ump. Большинство классов Microsoft Foundation реализуют переопределенную Dump функцию-член.

Классы, не производные от CObjectтаких, как CString, CTimeи CTimeSpanимеют собственные перегруженные CDumpContext операторы вставки, так как часто используемые структуры, такие как CFileStatus, CPointи CRect.

Если в реализации класса используется макрос IMPLEMENT_DYNAMIC или IMPLEMENT_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 выходные данные направляются в отладчик через функцию OutputDebugStringWindows.

Пример

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::D umpAsHex

Дампает указанный тип, отформатированный как шестнадцатеричные числа.

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::D umpAsHex.

Пример

#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