Операционная система Microsoft Windows 3.1 для программиста -том 3

         

Утилита HEAPWALK


В составе SDK имеется утилита HEAPWALK , с помощью которой вы можете выполнить анализ содержимого глобальной области памяти. Для любого модуля, загруженного в память (приложения или библиотеки DLL) эта утилита показывает адреса, идентификаторы, размеры и атрибуты блоков памяти. С помощью этой утилиты вы можете проследить за тем, как ваше приложение работает с глобальной областью памяти. Вы можете обнаружить в отлаживаемом приложении часто встречающуюся ошибку, когда оно (приложение) не освобождает полученные им блоки памяти.

Главное окно утилиты HEAPWALK представлено на рис. 2.12.

Рис. 2.12. Главное окно утилиты HEAPWALK

В главном окне находится список, каждая строка которого соответствует одному блоку памяти.

В столбцах списка отображается следующая информация (все численные значения выражаются шестнадцатеричными цифрами):

Название Описание
ADDRESS Адрес блока памяти
HANDLE Идентификатор блока памяти
SIZE Размер блока памяти в байтах
LOCK Содержимое счетчика фиксирования блока памяти. Если для блока памяти запрещен страничный обмен, в этом поле есть буква "P". Если блок памяти зафиксирован и не может быть удален, он обозначается буквой "L"
FLG Если блок памяти удаляемый (discardable), в этом поле находится буква "D", если фиксированный - буква "F"
HEAP Если объект имеет локальную область памяти, в этом столбце находится буква "Y"
OWNER Имя модуля (или приложения), владеющего блоком памяти
TYPE Тип объекта (сегмент кода, сегмент данных, ресурс и т. д.)

С помощью меню "Walk" вы можете выбрать один из трех режимов просмотра глобальной области памяти, выполнить дефрагментацию памяти, запросить удаление удаляемых блоков данных и т. д.

Если в меню "Walk" выбрать строку "Walk Heap", в главном окне утилиты HEAPWALK будет отображаться информация о всех объектах, расположенных в глобальной области памяти.

Для того чтобы просмотреть все удаляемые объекты, выберите из этого меню строку "Walk LRU List".


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

Если выбрать из меню "Walk" строку "GC(0) and Walk", утилита выполнит дефрагментацию глобальной области памяти, запросит блок памяти размером 0 байт и отобразит список объектов.

С помощью строки "GC(-1) and Walk" вы можете предпринять попытку удалить все удаляемые сегменты и просмотреть список объектов.

Остальные строки меню "Walk" описаны в руководстве по утилитам, входящим в состав SDK.

Для удобства отображения вы можете отсортировать блоки памяти в списке при помощи меню "Sort". С помощью этого меню можно выполнить сортировку по адресам блоков памяти (строка "Address" меню "Sort"), по именам модулей, которым принадлежат блоки памяти (строка "Module"), по размеру блоков памяти (строка "Size"), типу объектов (строка "Type"). С помощью строки "Refresh Seg Names" вы можете просмотреть имена сегментов, загруженных в память после запуска утилиты HEAPWALK.

Вы можете выбрать любую строку в списке объектов и просмотреть соответствующий ему блок памяти с помощью меню "Object".

Строка "Show" меню "Object" позволяет просмотреть содержимое блока памяти в виде шестнадцатеричного дампа памяти или ресурса (пиктограммы, изображения bitmap, меню, диалоговой панели и т. д.). На рис. 2.13 в окне "Resource Bitmap" можно увидеть изображение пиктограммы, соответствующей выбранному блоку памяти.



Рис. 2.13. Просмотр пиктограммы

С помощью строки "Discard" можно удалить выбранный объект из памяти.

Объект может быть отмечен как ближайший кандидат на удаление (строка "Oldest") или как объект, который должен быть удален в последнюю очередь (строка "Newest").

Строка "LocalWalk" позволяет вам просмотреть локальную область памяти для выбранного объекта (если у этого объекта есть локальная область памяти). Эта область памяти отображается в отдельном окне (рис. 2.14).



Рис. 2.14. Просмотр локальной области памяти

С помощью меню "Alloc" вы можете заказывать всю свободную память (строка "Allocate All of Memory") и освобождать блоки памяти различного размера (строки "Free All", "Free 1K", ..., "Free 50K", "Free XK").


Содержание раздела