Класс 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
на поток, направляются в отладчик через функцию OutputDebugString
Windows.
Класс 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 выходные данные направляются в отладчик через функцию OutputDebugString
Windows.
Пример
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