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


Дампы объектов

Обновлен: Ноябрь 2007

Этот раздел применим для следующих версий.

Выпуск

Visual Basic

C#

C++

Web Developer

Экспресс-выпуск

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Standard

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Pro и Team

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Условные обозначения:

Тема применяется

Применимо

Тема не применяется

Неприменимо

Тема применяется, но команда по умолчанию сокрыта

Команда или команды по умолчанию скрыты.

В программе MFC для вывода описания всех не освобожденных объектов кучи можно применять CMemoryState::DumpAllObjectsSince. DumpAllObjectsSince выводит все объекты, для которых была выделена память с последнего состояния CMemoryState::Checkpoint. Если вызова Checkpoint не было, DumpAllObjectsSinceотображает все объекты и не-объекты, находящиеся в памяти на данный момент.

8sdw7154.alert_note(ru-ru,VS.90).gifПримечание.

Перед тем как использовать вывод объектов MFC, следует включить Практическое руководство. Включение и отключение диагностики памяти.

8sdw7154.alert_note(ru-ru,VS.90).gifПримечание.

MFC автоматически отображает все потерянные объекты при выходе из программы, поэтому в точке выхода не нужно создавать для этого дополнительный код.

Следующий код — тест на утечку памяти путем сравнения двух состояний памяти и отображения всех объектов, если таковая обнаружилась.

Устаревший пример кода

if( diffMemState.Difference( oldMemState, newMemState ) )
{
   TRACE( "Memory leaked!\n" );
   diffMemState.DumpAllObjectsSince();
}

Содержимое дампа выглядит следующим образом:

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

Надежное программирование

Числа в фигурных скобках в начале большинства строк указывают порядок размещения объектов в памяти. Объект, размещенный в последнюю очередь, имеет наибольший номер и появляется вверху дампа. Подробное рассмотрение данного примера см. в разделе Интерпретация дампа объекта.

Чтобы извлечь из дампа объекта наибольшее количество сведений, можно переопределить функцию-член Dump любого объекта, производного от CObject, и с ее помощью Настройка дампа объекта.

Можно установить точку останова на определенном выделении памяти, задав глобальной переменной _afxBreakAlloc значение, показанное в фигурных скобках. При перезапуске программы отладчик остановит выполнение именно там, где происходит это выделение памяти. Теперь можно посмотреть стек вызовов и проанализировать, как программа дошла до этого места.

В библиотеке времени выполнения языка C тоже есть подобная функция, _CrtSetBreakAlloc, которая применяется для выделений памяти во время выполнения в языке C.

См. также

Другие ресурсы

Обнаружение утечек памяти в MFC