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

Утилиты для работы с процессами и диагностики
Глава 7 237
Просмотр дампа в отладчике
Во всех дампах, полученных при выполнении условия, ProcDump записыва-
ет комментарии о причине их получения. Такие комментарии можно увидеть
в первоначальном тексте, который WinDbg показывает при открытии файла
дампа. Первая строка комментария описывает командную строку ProcDump,
использованную для создания дампа. Вторая строка комментария описывает
причину получения дампа и другие связанные данные, если таковые доступ-
ны. Например, если превышен порог памяти, в комментарии будет сказано о
пределе выделения памяти и использовании выделения памяти процессом:
*** Process exceeded 100 MB commit usage: 107 MB
Если превышен порог использования ЦП, в комментарии будет указан
порог ЦП, длительность и идентификатор потока (TID), использовавшего
наибольшее число циклов ЦП в тот промежуток времени:
*** Process exceeded 50% CPU for 3 seconds. Thread consuming CPU: 4484 (0x1184)
Если превышен порог счетчика производительности, в комментарии бу-
дет указан счетчик производительности, порог, длительность и TID потока,
использовавшего наибольшее число циклов ЦП в тот промежуток времени.
(Показанный ниже текст должен быть выведен в одной строке с пробелом
между точкой и словом «Thread».)
*** Counter «\Process(notepad_1376)\% Processor Time» exceeded 5 for 3
seconds. Thread consuming CPU: 1368 (0x558)
Если дамп создан из-за зависшего окна, комментарий будет включать
описатель окна в шестнадцатеричном виде. Если дамп был получен неза-
медлительно, был отложен или инициирован исключением или обычным
завершением работы, в комментарии будет указана только причина без до-
полнительных данных.
Чтобы вам не пришлось изменять контекст занятого потока (команда
~~[TID]s) при открытии дампа, созданного из-за превышения порога ЦП
или счетчика производительности, ProcDump вставляет фальшивое исклю-
чение, делающее это за вас. Это очень полезно при получении нескольких
файлов дампа, так как можно открывать каждый файл, зная, что интере-
сующим вас потоком является контекст потока, выбранный по умолчанию.
Вставка фальшивого исключения в дамп приводит к тому, что отладчик со-
общает об ошибке следующим текстом:
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(104c.14c0): Wake debugger - code 80000007 (first/second chance not available)
eax=000cfe00 ebx=00188768 ecx=00000001 edx=00000000 esi=00000000 edi=00000000
eip=01001dc7 esp=00feff70 ebp=00feff88 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
Теперь вы об этом знаете и можете игнорировать такие сообщения.
SIN_ch_07.indd 237
27.12.2011 14:30:27

238 Часть
II
Работа с утилитами
DebugView
DebugView — приложение для мониторинга отладочного вывода с локаль-
ного или удаленного компьютера. В отличие от большинства отладчиков,
DebugView может отображать выходные данные пользовательского режи-
ма, полученных от всех процессов одного сеанса, а также выходные данные
режима ядра. DebugView предоставляет гибкие параметры входа в систему
и отображения данных и работает во всех версиях (x86 и x64) Windows XP
и последующих ОС.
Отладочный вывод
В Windows есть API, позволяющие программам отправлять текст, который
может быть получен и отображен отладчиком. Если нет активного отладчи-
ка, эти API ничего не делают. Такие интерфейсы облегчают предоставление
диагностических данных, которые могут быть получены любым стандарт-
ным отладчиком или проигнорированы, если отладчик не подключен.
Отладочный вывод может генерироваться как программами пользова-
тельского режима, так и драйверами режима ядра. Для программ пользова-
тельского режима Windows предоставляет Win32 API OutputDebugString. 16-
разрядные приложения, работающие на платформе x86, могут предоставлять
выходные данные отладки вызовом Win16 API OutputDebugString, который
перенаправляется интерфейсу Win32 API. Для управляемых приложений в
.NET Framework имеются классы System.Diagnostics.Debug и Trace со стати-
ческими методами, выполняющими внутренние вызовы OutputDebugString.
Эти методы можно вызывать также из Windows PowerShell:
[System.Diagnostics.Debug]::Print(«Выходные данные отладки»)
Драйверы режима ядра могут генерировать отладочный вывод, вызы-
вая подпрограммы DbgPrint и DbgPrintEx или соответствующие функции.
Программисты могут также использовать макросы KdPrint и KdPrintEx, ге-
нерирующие отладочный вывод только в отладочных сборках и “молчащие”
в итоговых сборках.
Windows предоставляет две реализации API OutputDebugString, — ANSI
и Unicode, — но при внутренней обработке выходные данные кодируются в
ANSI. Unicode-реализация преобразует текст отладки, используя параме-
тры локальной системы, и передает его реализации ANSI. В результате, не-
которые символы Unicode могут отображаться некорректно.
Экран DebugView
Запустите программу DebugView (Dbgview.exe). Она немедленно начнет пе-
рехват и отображение вывода отладки Win32, полученных со всех рабочих
столов текущего сеанса сервера терминалов.
Примечание
Все интерактивные сеансы рабочего стола реализованы как сеансы
сервера терминалов.
SIN_ch_07.indd 238
27.12.2011 14:30:27

Утилиты для работы с процессами и диагностики
Глава 7 239
Как видно из рис. 7-13, первый столбец содержит порядковый номер, на-
значенный программой. В порядковых номерах могут появляться пропуски,
когда правила фильтрации исключают строки текста или внутренние бу-
феры DebugView переполняются при очень активной работе. Порядковые
номера сбрасываются каждый раз, когда экран очищается. (О фильтрации
рассказывается далее в этой главе.)
Рис. 7-13. DebugView
Во втором столбце указано время захвата элемента, выраженное в про-
шедшем времени или времени системных часов. По умолчанию отобража-
ется число секунд, прошедшее с момента получения первой отладочной
записи, и первый элемент всегда имеет время 0.00, что может быть полез-
ным при отладке проблем, связанных со временем. Данный таймер сбрасы-
вается при очистке экрана. Если хотите, чтобы вместо этого отображалось
локальное время, выберите в меню Options (Параметры) команду Clock
Time (Системное время). Если требуется, чтобы временной штамп содер-
жал миллисекунды, выберите команду меню Options | Show Milliseconds
(Параметры | Показывать миллисекунды). Настраивать отображение вре-
мени можно также с помощью параметров командной строки
/o
(для ото-
бражения системного времени),
/om
(для отображения системного времени
с миллисекундами) и
/on
(для отображения прошедшего времени).
Совет При включении отображения миллисекунд параметры уже показанных запи-
сей не меняются. Можно обновить эти записи, дважды нажав Ctrl+T, чтобы отключить
и снова включить отображение системного времени. После этого все записи будут
показывать миллисекунды.
Выходные данные отладки отображаются в столбце Debug Print (Печать
отладки). Выходные данные пользовательского режима содержат иденти-
фикатор процесса (PID), сгенерировавшего выходные данные, заключенный
в квадратные скобки, за которым идут сами данные. Если отображение PID
не нужно, отключите параметр Win32 PIDs в меню Options (Параметры).
Можно выбрать одну или несколько строк выходных данных отладки
и скопировать их в буфер обмена, нажав Ctrl+C. DebugView поддержива-
SIN_ch_07.indd 239
27.12.2011 14:30:27

240 Часть
II
Работа с утилитами
ет стандартные способы выделения нескольких строк с Shift и клавишами-
стрелками вверх и вниз (для выделения смежных строк) и щелчки с Ctrl
(для выделения несмежных строк).
По умолчанию включен параметр Force Carriage Returns (Принудитель-
ный возврат каретки), чтобы каждая строка отладочного вывода появля-
лась на новой строке, независимо от того, завершается ли переданный текст
символом возврата каретки. Если отключить этот параметр в меню Options
(Параметры), DebugView будет помещать текст в буфер и выводить на
экран только в том случае, если встречается символ возврата каретки или
если буфер заполняется (его размер — примерно 4192 символа). Это позво-
ляет приложениям и драйверам создавать строки, содержащие несколько
вызовов функций, генерирующих отладочный вывод. Но если выходные
данные генерируются несколькими процессами, они могут смешиваться, и
PID, указанный в строке, будет идентификатором процесса, передавшего
символ возврата каретки или заполнившего буфер.
Если текст не умещается в столбце, наведите на него указатель мыши, по-
лый текст откроется во всплывающей подсказке.
Новые выходные данные отладки добавляются в конец списка. Функция
Autoscroll (Автопрокрутка), отключенная по умолчанию, прокручивает
экран при появлении новых записей, чтобы были видны последние данные.
Чтобы включить или отключить эту функцию, нажмите Ctrl+A или щел-
кните на значке Autoscroll (Автопрокрутка) на панели инструментов.
Выходные данные можно комментировать, выбрав команду Append
Comment (Добавить комментарий) в меню Edit (Правка). Текст, введен-
ный в диалоговом окне Append Comment (Добавление комментария), бу-
дет добавлен к выходным данным на экране и в файл журнала, если ведение
журнала включено. Заметьте, что правила фильтрации применяются к до-
бавленным комментариям так же, как и к отладочному выводу.
Можно увеличить место для отображения вывода, выбрав в меню Options
(Параметры) команду Hide Toolbar (Скрыть панель инструментов). Можно
также увеличить число видимых строк, выбрав меньший размер шрифта.
Чтобы изменить шрифт, выберите в меню Options (Параметры) команду
Font (Шрифт).
Чтобы DebugView запустился в фоновом режиме, не занимая места на
панели задач, выберите в меню Options (Параметры) команду Hide When
Minimized (Скрывать при сворачивании). Если после этого свернуть окно
DebugView, его будет видно только как значок в области уведомлений (так-
же известной как «трей»). Можно щелкнуть на этом значке правой кнопкой
мыши, чтобы открыть контекстное меню Capture (Захват), с помощью ко-
торого можно включать и отключать различные параметры захвата. Чтобы
снова открыть окно программы, дважды щелкните на этом значке. Параметр
Hide When Minimized можно включить при запуске, добавив /t в команд-
ную строку.
SIN_ch_07.indd 240
27.12.2011 14:30:28

Утилиты для работы с процессами и диагностики
Глава 7 241
Если выбрать в меню Options (Параметры) команду Always On Top
(Всегда сверху), окно DebugView всегда будет отображаться поверх других
окон на рабочем столе, если его не свернуть.
Получение отладочного вывода пользовательского режима
DebugView может получать отладочный вывод из нескольких локальных
источников: текущий сеанс служб терминалов, глобальный сеанс служб
терминалов («сеанс 0») и режим ядра. Каждый из этих источников можно
выбрать в меню Capture (Захват). Весь захват можно включить или отклю-
чить, выбрав команду Capture Events (Захват событий), нажав Ctrl+E или
щелкнув на значке Capture (Захват) на панели инструментов. Если захват
событий отключен, вывод не принимается, а если включен, данные прини-
маются из выбранных источников.
По умолчанию DebugView получает выходные данные только от теку-
щего сеанса служб терминалов, которому соответствует команда Capture
Win32 (Захват Win32) меню Capture (Захват). Сеанс служб терминалов
представляет всю активность пользовательского режима, связанную с инте-
рактивным рабочим столом. Сюда входят все процессы, работающие в окон-
ных станциях и рабочих столах (Win32) этого сеанса.
В Windows XP и Windows Server 2003 интерактивный сеанс может на-
ходиться в сеансе 0 и находится там всегда, когда не задействовано бы-
строе переключение пользователей и удаленный рабочий стол. Кроме того,
в сеансе 0 выполняются все службы и определяются глобальные объекты.
Если DebugView выполняется в сеансе 0, и включен захват Win32 (Capture
Win32), будут захватываться выходные данные отладки от служб и про-
цессов интерактивного пользователя. Для получения выходных данных от-
ладки из текущего сеанса, даже если это данные служб, администраторские
права не требуются (подробнее см. в главе 2.)
Когда включено быстрое переключение пользователей или удаленный
рабочий стол, пользователи Windows XP и Windows Server 2003 часто вхо-
дят в сеансы, отличные от глобального. Кроме того, начиная с Windows
Vista, изоляция сеанса 0 гарантирует, что пользователи никогда не входят
в тот сеанс, в котором работают службы. При работе не в нулевом сеансе
DebugView добавляет в меню Capture (Захват) команду Capture Global
Win32 (Захват глобальных данных Win32). Если включить этот параметр,
будут захватываться выходные данные от процессов, работающих в сеансе 0.
Для использования этого параметра в Windows Vista и последующих верси-
ях ОС, DebugView необходимы повышенные привилегии. Для включения
этого параметра в Windows XP администраторские права не требуются.
Получение отладочного вывода режима ядра
DebugView можно настроить для получения выходных данных отладки ре-
жима ядра, генерируемых драйверами устройств и ядром Windows, включив
SIN_ch_07.indd 241
27.12.2011 14:30:28