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

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

Утилиты для работы с процессами и диагностики
Глава 7 223
по тому же адресу. Когда это происходит, VMMap не регистрирует новую
запись, а выводит в столбце Bytes (Байты) размер первой области, выде-
ленной по этому адресу, но суммарный размер памяти для данной функции
подсчитывается правильно.
По умолчанию окно Trace (Трассировка) показывает только те опера-
ции, для которых значение в столбце Bytes (Байты) больше нуля. Чтобы
отображать и «нулевые» операции, установите флажок Show All Memory
Operations (Показывать все операции с памятью). Сюда входят такие опе-
рации, как RtlCreateHeap, RtlFreeHeap и 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

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

Утилиты для работы с процессами и диагностики
Глава 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

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