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

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

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

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

Добавлен: 29.10.2018

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

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

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

232  Часть 

II   

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

рабатываемым исключением. Если добавить параметр –b, ProcDump будет 
обрабатывать точки останова как исключения; в противном случае они иг-
норируются. Например, программа может содержать следующий код:

if (IsDebuggerPresent()) 
    DebugBreak();

ProcDump подключается к целевой программе как отладчик, API 

IsDebuggerPresent возвращает TRUE, и вызывается DebugBreak. ProcDump 
будет создавать дамп при вызове DebugBreak только в том случае, если ука-
зан параметр –b.

Параметр –h создает дамп, когда окно верхнего уровня целевого процесса 

зависает (перестает «отвечать»). В ProcDump «не отвечает» означает то же, 
что и в Диспетчере задач Windows: если окно, принадлежащее процессу, не 
отвечает на оконные сообщения в течение пяти секунд, оно считается за-
висшим. Для использования этого параметра ProcDump должна работать на 
том же рабочем столе, что и целевой процесс.

Для получения дампа можно использовать порог выделения памяти про-

цесса. Укажите параметр –m и порог в МБ. В следующем примере дамп соз-
дается, когда выделение памяти приложению Testapp превышает 200 МБ:

procdump -m 200 testapp

ProcDump проверяет счетчики памяти процесса раз в секунду и создает 

дамп только в том случае, если объем выделенной процессу памяти, сопо-
ставленный с системным пределом выделения (сумма размеров файлов под-
качки и большей части ОЗУ), превышает порог в момент проверки. Если 
произошло кратковременное выделение памяти, ProcDump может не заме-
тить его.

Наконец, в качестве условия создания дампа можно использовать любой 

счетчик производительности. Укажите параметр –p, имя счетчика произво-
дительности и пороговое значение. Если имя счетчика содержит пробелы, 
заключите его в двойные кавычки. В следующем примере создается дамп 
Taskmgr.exe, когда число процессов в системе превышает 750 в течение трех 
секунд:

procdump -p «\System\Processes» 750 -s 3 taskmgr.exe

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

вить их в Монитор производительности (Performance Monitor), а затем 
просмотреть имена на вкладке Данные (Data) в диалоговом окне Свойства 
(Properties). Однако Perfmon для различения имен экземпляров одного про-
цесса по умолчанию использует нотацию со знаком # и порядковым номером 
(например, cmd#2), которая непредсказуема и нестабильна: имя, связанное 
с определенным процессом может измениться, когда запускается или завер-
шается другой процесс. ProcDump не поддерживает такую нотацию, вместо 
которой использует нотацию процесс_PID, описанную в статье базы знаний 

SIN_ch_07.indd   232

27.12.2011   14:30:26


background image

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

Глава 7  233 

Microsoft Knowledge Base 281884. Например, если имеется два экземпляра 
Testapp с PID 1135 и 924, к первому из них можно обратиться, указав имя 
testapp_1135. В следующем примере создается дамп этого процесса, если 
счетчик его описателей превышает 200 в течение трех секунд:

procdump -p «\Process(testapp_1135)\Handle Count» 200 -s 3 1135

Нотация процесс_PID не является обязательной. Можно указать только 

имя процесса, но если запущено несколько экземпляров этого процесса, ре-
зультаты будут непредсказуемыми.

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

если Testapp превышает порог ЦП или выделения памяти, имеет зависшее 
окно или необрабатываемое исключение, или завершает работу по другим 
причинам:

procdump -m 200 -c 90 -s 3 -u -h -t -e testapp

Чтобы прекратить мониторинг, нажмите Ctrl+C или Ctrl+Break.

Параметры файла дампа

В зависимости от того, какую версию библиотеки dbghelp.dll использует 
ProcDump, доступны разные параметры дампов отладки. Чтобы получить 
доступ ко всем самым полезным функциям, установите последнюю версию 
утилит отладки для Windows (Debugging Tools for Windows), скопируйте 
ProcDump.exe в папку, содержащую файл dbghelp.dll и запустите ее оттуда.

Дампы, созданные ProcDump, содержат, как минимум, базовую инфор-

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

 Примечание  При использовании Dbghelp.dll версии 6.1 и выше ProcDump добавляет 

сведения об использовании ЦП потоками, так что команда отладчика !runaway может 
показывать объем времени, затраченный каждым потоком. Версия 6.1 входит в состав 
Windows 7 и Windows Server 2008 R2.

Чтобы включить в дамп всю доступную память процесса, добавьте в ко-

мандную строку параметр –ma. Если используются новые версии dbghelp.
dll, этот параметр также получает информацию об областях памяти, включая 
сведения о параметрах распределений и защиты. Заметьте, что параметр –ma 
делает дамп намного больше, а запись памяти крупных приложений на диск 
может занимать несколько минут. (Дампы miniplus, описанные в следующем 
разделе, так же полезны, как полные дампы, но на 50–90% меньше их.)

Обычно ProcDump требует приостановки целевого процесса во время 

получения дампа. В Windows 7 и Windows Server 2008 R2 появилась функ-
ция отражения процесса, позволяющая «клонировать» процесс, так что он 
может продолжать работу, пока создается моментальный снимок памяти. 

SIN_ch_07.indd   233

27.12.2011   14:30:26


background image

234  Часть 

II   

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

Чтобы использовать эту функцию, добавьте параметр –r. ProcDump создает 
три файла: файл_дампа.dmp, в который записывается информация о про-
цессе и потоке; файл_дампа-reflected.dmp, в который записывается память 
процесса; и файл_дампа.ini, связывающий предыдущие два файла и являю-
щийся файлом, который следует открывать в отладчике. Windbg восприни-
мает *.ini как допустимый тип файлов дампа, хотя в диалоговом окне откры-
тия файлов это не указано.

В версиях x64 ProcDump создает 32-разрядный фал дампа, если целевой 

процесс является 32-разрядным. Чтобы создать 64-разрядный файл дампа, 
добавьте в командную строку ProcDump параметр -64.

Дампы miniplus

Тип дампов miniplus (-mp) разработан специально для решения пробле-
мы получения полных дампов крупных приложений, таких как Microsoft 
Exchange Information Store (store.exe) на крупных серверах. Например, по-
лучение полного дампа Exchange 2010 может занять 30 минут и привести к 
созданию файла размером в 48 ГБ. Сжатие этого файла до 8 ГБ может за-
нять еще 60 минут, а передача сжатого файла в службу поддержки Microsoft 
займет еще 6 часов. Получение такого же дампа miniplus займет одну мину-
ту, будет получен файл дампа размером в 1,5 ГБ, который можно сжать за 2 
минуты и отправить в службу поддержки за 15 минут.

Хотя первоначально этот алгоритм создавался для Exchange, он уни-

версален и работает также для SQL Server и любого другого приложения 
Microsoft, выделяющего крупные области памяти, благодаря эвристическо-
му поиску данных для включения в дамп.

При получении дампа miniplus сначала создается мини-дамп, к которо-

му добавляется (отсюда «плюс» в названии) память, потенциально полез-
ная для отладки. На первом этапе алгоритм рассматривает только страницы, 
помеченные как доступные для чтения и записи. Это позволяет исключить 
большинство страниц образа, но оставляет страницы образа, связанные 
с глобальными переменными. На следующем этапе алгоритм ищет самую 
большую область памяти, доступную для чтения/записи, размером более 
512 МБ. Если таковая найдена, она временно исключается. Областью счи-
тается набор выделенных блоков памяти одинакового размера. Например, 
если есть двадцать областей по 64 МБ (1280 МБ в сумме) и пять областей по 
128 МБ (640 МБ в сумме), будут исключены области по 64 МБ, так как они 
занимают больше памяти, чем области по 128 МБ, хотя размер этого блока 
меньше. Эти исключенные области еще могут быть включены. Они делят-
ся на участки по 4 МБ, и если на какой-то из этих участков есть ссылка из 
какого-либо стека потоков, этот участок включается в дамп.

Даже если процесс не слишком велик, дампы miniplus все равно будут 

значительно меньше полных дампов, так как не содержат исполняемый об-
раз процесса. Например, полный дамп Блокнота (Notepad) занимает при-
мерно 50 МБ, а дамп miniplus — всего около 2 МБ. Полный дамп Word обыч-

SIN_ch_07.indd   234

27.12.2011   14:30:26


background image

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

Глава 7  235 

но занимает около 280 МБ, а дамп miniplus — около 36 МБ. Если процесс 
не слишком большой, можно узнать примерный размер дампа по значению 
параметра Total/Private в VMMap.

 Примечание  При отладке дампов miniplus отладчик требует подстановки пропущен-

ных страниц образа из хранилища символов (.sympath) или хранилища исполняемых 
файлов (.exepath). Если вы создаете дампы miniplus для собственного приложения, 
вам потребуются символы и исполняемые файлы этого приложения.

Дополнительное преимущество дампов miniplus — возможность восста-

новления после сбоев чтения памяти. Сбои чтения памяти — причина, по 
которой различные утилиты получения дампов иногда не могут получить 
полный дамп. Если у вас возникли проблемы при получении полного дампа, 
попробуйте получить дамп miniplus, чтобы задействовать возможность вос-
становления.

При создании дампов miniplus можно использовать другие параметры 

ProcDump, что продемонстрировано в примерах ниже. Чтобы получить один 
дамп miniplus приложения store.exe, выполните следующую команду:

procdump -mp store.exe

Следующая команда позволяет получить один дамп miniplus при сбое в 

store.exe:

procdump -mp -e store.exe

Следующая команда получает три дампа miniplus с интервалом 15 се-

кунд:

procdump -mp -n 3 -s 15 store.exe

Чтобы получить три дампа miniplus, когда счетчик производительности 

RPC Averaged Latency превышает значение 250 мс в течение 15 секунд, ис-
пользуйте следующую команду:

procdump -mp -n 3 -s 15 -p «\MSExchangeIS\RPC Averaged Latency» 250 store.exe

 Примечание  Я не рекомендую получать дампы miniplus для управляемых (.NET) 

приложений. Создавайте вместо этого полные дампы (-ma). Алгоритм дампов miniplus 
пытается получить полный дамп для таких приложений, но так он создается на основе 
минидампа, полученный дамп не является полным. Полный дамп требуется потому, 
что отладчику нужны полные структуры данных GC и доступ к образу NGEN (чего 
нельзя получить из хранилища символов или исполняемых файлов).

Неинтерактивный запуск ProcDump

ProcDump не требует запуска в интерактивном сеансе рабочего стола. 
Неинтерактивный запуск может потребоваться для мониторинга длительно 
работающего процесса, чтобы не оставаться в системе на все время монито-
ринга, для решения проблемы, возникающей в отсутствие в системе пользо-
вателей или во время выхода из системы.

SIN_ch_07.indd   235

27.12.2011   14:30:26


background image

236  Часть 

II   

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

В следующем примере показано, как использовать PsExec для запуска 

ProcDump от имени системы в том же неинтерактивном сеансе и на том же 
рабочем столе, которые используют службы, запущенные от имени систе-
мы. Запуск выполняется в экземпляре Cmd.exe, чтобы консольный выход 
можно было перенаправить в файлы. Обратите внимание на символ escape-
последовательности (^) перед символом перенаправления выхода (>), ука-
зывающего на то, что последний не должен считаться символом перенаправ-
ления выхода PsExec, а является частью командной строки Cmd.exe. Весь 
пример должен набираться как единая строка команды. (Подробнее о PsExec 
см. гл. 6; подробнее о неинтерактивных сеансах и рабочих столах см. гл. 2.)

psexec -s -d cmd.exe /c procdump.exe -e -t testapp c:\temp\testapp.dmp ^> 
c:\temp\procdump.out 2^> c:\temp\procdump.err

Если в целевом приложении возникает сбой во время выхода пользова-

теля из системы, такая команда будет работать лучше, чем запуск ProcDump 
в том же сеансе, поскольку ProcDump может завершить работу раньше, чем 
целевое приложение. Если же при выходе из системы целевое приложение 
принудительно завершается, ProcDump не сможет получить дамп. ProcDump 
действует как отладчик для целевого процесса, а выход из системы отключает 
все отладчики, подключенные к  принудительно завершаемым процессам.

Заметьте также, что ProcDump не может выполнять мониторинг завис-

ших окон приложений, когда целевой процесс работает на другом рабочем 
столе.

Захват всех сбоев приложений с помощью ProcDump

ProcDump можно использовать и для создания дампа при сбое приложе-
ния, назначив эту утилиту «посмертным» отладчиком1. В разделе реестра 
HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug введите 
в качестве значения «Debugger» REG_SZ командную строку ProcDump, ис-
пользуя %ld как заменитель для PID сбойного процесса. Например, следую-
щая команда будет создавать полный дамп памяти в папке C:\Dumps, когда 
любое приложение завершается из-за сбоя, используя в качестве имени фай-
ла имя процесса и временной штамп:

«C:\Program Files\Sysinternals\procdump.exe» /accepteula -ma %ld C:\Dumps

Важно указать путь к файлу дампа. В противном случае ProcDump будет 
пытаться создать дамп в текущей папке, которой при таком способе запуска 
будет %SystemRoot%\System32. Так как назначенный отладчик запускается 
в том же контексте безопасности, что и сбойный процесс, ProcDump не смо-
жет создать файл дампа в этой папке, если процесс не имеет администратор-
ских прав. Заметьте также, что целевая папка должна существовать и в нее 
должна быть разрешена запись.

1

 Это можно сделать и при помощи Windows Error Reporting, но ProcDump легче настроить.

SIN_ch_07.indd   236

27.12.2011   14:30:26