Файл: Руссинович М., Маргозис А. Утилиты Sysinternals. Справочник администратора 2012.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Операционные системы

Добавлен: 29.10.2018

Просмотров: 33091

Скачиваний: 742

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

222  Часть 

II   

Работа с утилитами

tails с сохранением порядка сортировки. Копируются все данные о вло-
женных в группу операциях выделения, даже если группа свернута. Если 
в представлении Summary выделен определенный тип памяти, из пред-
ставления Details будут скопированы только данные об этом типе;

•  нажатие Ctrl+C копирует весь текст из таблицы Summary, если активно 

представление Summary. Если в фокусе находится представление Details, 
будет скопировано поле адреса из выбранной строки, которое затем мож-
но вставить в отладчик.

Просмотр распределения памяти в процессе 
с подгруженной DLL VMMap

Подгрузив в процесс свою DLL, VMMap перехватывает вызовы API вирту-
альной памяти и получает следующую информацию о них:
•  имя функции, указывающее тип выделяемой памяти. Например, Virtu-

alAlloc и VirtualAllocEx выделяют закрытую память; RtlAllocateHeap вы-
деляет память в куче;

•  операция, такая как Reserve, Commit, Protect (изменение защиты) и Free;
•  тип защиты памяти, такой как «выполнение/чтение» и «чтение/запись»;
•  запрошенный размер в байтах;
•  адрес виртуальной памяти, по которому выделен блок;
•  стек вызовов в момент вызова API.

Стек вызовов показывает путь к коду, инициировавшему запрос выделе-

ния памяти. VMMap назначает каждому уникальному стеку вызовов номер 
(Call Site ID). Первый стек вызовов получает номер 1, второй — номер два и 
т.д. Если некоторый код выполняется несколько раз, у каждого вызова будет 
один и тот же стек, и данные о выделенной этими вызовами памяти будут 
сгруппированы под одним номером Call Site ID.

 Примечание  Для получения полезной информации о процессах без подгруженной 

DLL необходима корректная настройка символов (см. главу 2).

Обновите основное окно VMMap и щелкните кнопку Trace (Трассиров-

ка). Откроется окно Trace (Трассировка) со списком всех операций выделе-
ния памяти, сгруппированных по идентификатору вызывающего кода 
(рис. 7-7). В столбце Function (Функция) указана вызванная API-функция; 
в столбце Calls (Вызовы) указано, сколько раз она была вызвана; в столбце 
Bytes (Байты) — общий объем памяти, выделенной этим кодом. Столбцы 
Operation (Операция) и Protection (Защита) содержат значения, передан-
ные при первом вызове этой функции.

Щелкните знак +, чтобы раскрыть узел вызовов и просмотреть адре-

са виртуальной памяти, по которым предоставлена запрошенная память. 
В столбце Bytes (Байты) показан размер каждой выделенной области. 
Заметьте: если память освобождается, последующие запросы выделения, 
отправленные тем же кодом, могут удовлетворяться выделением памяти 

SIN_ch_07.indd   222

27.12.2011   14:30:24


background image

Утилиты для работы с процессами и диагностики 

Глава 7  223 

по тому же адресу. Когда это происходит, VMMap не регистрирует новую 
запись, а выводит в столбце Bytes (Байты) размер первой области, выде-
ленной по этому адресу, но суммарный размер памяти для данной функции 
подсчитывается правильно.

По умолчанию окно Trace (Трассировка) показывает только те опера-

ции, для которых значение в столбце Bytes (Байты) больше нуля. Чтобы 
отображать и «нулевые» операции, установите флажок Show All Memory 
Operations (Показывать все операции с памятью)
. Сюда входят такие опе-
рации, как RtlCreateHeapRtlFreeHeap и VirtualFree (при освобождении цело-
го блока).

Рис. 7-7.  Окно VMMap Trace

Рис. 7-8.  Стек вызовов для функции, открытый из окна Trace

На рис. 7-7 код с ID 1136 был вызван восемь, в результате выделено 26 МБ

закрытой памяти. Этот узел раскрыт, видны адреса виртуальной памяти и 
размеры запрошенной памяти. Поскольку все эти запросы отданы одним 
кодом, можно выбрать любой из них или узел верхнего уровня и щелкнуть 
кнопку  Stack (Стек), чтобы просмотреть стек вызовов для этой функции 
(рис. 7-8). Если доступны полные символы и исходный текст, выберите в 
стеке вызовов фрейм и щелкните кнопку Source (Исходный код), чтобы 

SIN_ch_07.indd   223

27.12.2011   14:30:24


background image

224  Часть 

II   

Работа с утилитами

просмотреть исходный код при помощи утилиты просмотра исходных фай-
лов VMMap, которая выделит соответствующую строку в коде.

Щелкните кнопку Call Tree (Дерево вызовов) в главном окне VMMap, 

чтобы получить еще одно представление выделения памяти. Окно Call Tree 
(Дерево вызовов)
 (рис. 7-9) показывает сходства и различия всех записан-
ных стеков в виде дерева. Верхние узлы представляют самые давние вызовы 
в стеке. Их дочерние узлы представляют функции, вызываемые ими, а «вну-
чатые» узлы — функции, вызываемые в ходе операций с памятью. Столбцы 
Count (Счет) и  % Count (Счет %) в каждой строке показывают, сколько 
раз был вызван этот код во всех стеках; а столбцы Bytes (Байты) и % Bytes 
(Байты %)
 показывают, сколько памяти было этими вызовами. Эти данные 
можно использовать для быстрого кода, выделяющего максимальный объем 
памяти или отправляющего наибольшее число запросов на выделение.

Рис. 7-9.  Окно VMMap Call Tree

Наконец, можно увидеть стек вызовов для определенной операции вы-

деления памяти в куче, выбрав ее в представлении Details и щелкнув кнопку 
Heap Allocations (Выделение из кучи), чтобы открыть одноименное окно 
(рис. 7-10). Выберите элемент в этом окне и щелкните кнопку Stack (Стек) —
откроется стек вызовов для этой операции выделения памяти.

Рис. 7-10.  Окно Heap Allocations

SIN_ch_07.indd   224

27.12.2011   14:30:25


background image

Утилиты для работы с процессами и диагностики 

Глава 7  225 

Фрагментация адресного пространства

Некорректное управление памятью может привести к тому, что при большом 
объеме свободной памяти не окажется ни одного свободного блока, доста-
точного для удовлетворения очередного запроса на выделение памяти. Окно 
Address Space Fragmentation (Фрагментация адресного пространства) 
показывает компоновку различных типов областей памяти, выделенной 
в адресном пространстве 32-разрядного процесса (рис. 7-11). Эта информа-
ция помогает выяснить, является ли источником проблемы фрагментация, 
и найти области, создающие ее.

Рис. 7-11.  Фрагментация адресного пространства (только для 32-разрядных процессов)

При анализе 32-разрядного процесса выберите команду меню View | Frag-

mentation (Вид | Фрагментация), чтобы открыть окно Address Space Frag-
mentation (Фрагментация адресного пространства)
. Диаграмма в этом окне 
показывает типы выделенной памяти, используя те же цвета, что и главное 
окно VMMap; меньшие виртуальные адреса собраны в верхней части окна. 
Адреса вверху и слева внизу представляют границы текущего отображаемого 
диапазона адресов. Если диапазон адресов не умещается в окно, используй-
те вертикальную полосу прокрутки. Ползунок слева от диаграммы позволя-
ет изменять ее детализацию: перетаскивание его вниз увеличивает размер 
блоков на диаграмме. Если щелкнуть область на диаграмме, под диаграммой 
будет показан адрес этой области, ее размер и тип, соответствующая область 
также будет выделена в представлении Details в главном окне VMMap.

Сохранение и загрузка моментальных снимков

Команды  Save (Сохранить) и Save As (Сохранить как), расположенные 
в меню File (Файл), позволяют сохранять моментальный снимок VMMap 
в разных форматах:
•  .MMP — собственный формат файлов VMMap. Используйте его, если 

нужно загрузить снимок в VMMap на том же или другом компьютере. 

SIN_ch_07.indd   225

27.12.2011   14:30:25


background image

226  Часть 

II   

Работа с утилитами

В этом формате сохраняются все снимки, что позволяет сравнивать их 
в окне Timeline после загрузки в VMMap;

•  .CSV — данные последнего снимка в виде значений, разделенных запя-

тыми, идеально для импорта в Microsoft Excel. Если в представлении 
Summary выбран определенный тип памяти, будут сохранены сведения 
только о нем;

•  .TXT — форматированный текст, удобен для публикации результатов 

в понятной человеку форме с использованием моноширинного шрифта. 
Как и при использовании формата CSV, при выборе определенного типа 
памяти сохраняются данные только о нем.
Чтобы загрузить в VMMap сохраненный .MMP-файл, нажмите Ctrl+O 

или укажите имя файла в командной строке, используя параметр 

–o

. Кроме 

того, при запуске VMMap расширение .mmp сопоставляется с этой програм-
мой, что позволяет открывать сохраненные .mmp-файлы двойным щелчком 
в Проводнике.

Параметры командной строки VMMap

VMMap поддерживает следующие параметры командной строки:

vmmap [-64] [-p {PID | имя_процесса} [выходной_файл]] [-o входной_файл]

Параметр –64
В версиях Windows x64 VMMap запускает свою 32- или 64-разрядную версию, 
когда выбирается 32- или 64-разрядный процесс, соответственно. Параметр -64 
позволяет использовать 64-разрядную версию VMMap для анализа всех про-
цессов. При анализе 32-разрядных процессов 32-разрядная версия VMMap 
точнее разделяет типы памяти по категориям. Преимущество 64-разрядной 
версии в том, что она может определить ID потока, связанный с 64-разрядными 
стеками, и сообщает более точные данные о системной памяти. 

 Примечание  Параметр -64 применяется только для доступа к работающим процес-

сам; он не действует при впрыскивании DLL и отслеживании процессов, запущенных 
из VMMap.

Параметр –p
Такой формат используется для анализа процесса, указанного по идентифи-
катору (PID) или имени. Если указать имя, VMMap сопоставит его с пер-
вым процессом, имя которого начинается с указанного текста.

Если указать выходной файл, VMMap просканирует целевой процесс, 

выведет результаты в указанный файл и завершит работу. Если не указать 
расширение файла, VMMap добавит расширение .MMP и сохранит данные 
в собственном формате. Если указать расширение .CSV, данные будут сохра-
нены в виде значений, разделенных запятыми. Если указать любое другое 
расширение, выходные данные будут сохранены в формате TXT.

SIN_ch_07.indd   226

27.12.2011   14:30:25