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

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

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

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

Добавлен: 29.10.2018

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

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

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

Основные понятия Windows  

Глава 2  27 

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

 Примечание 

Исполняемые файлы, загруженные в процессы пользовательского ре-

жима, как правило, являются EXE-файлами, позволяющими запускать новые процес-
сы, либо DLL, загружаемыми в существующий процесс. Бывают исполняемые файлы 
и с другими расширениями. Так, файлы с расширениями COM или SCR фактически 
являются EXE-файлами, в то время как файлы с расширениями ACM, AX, CPL, DRV и 
OCX являются разновидностями DLL. Программы установки обычно распаковывают и 
запускают EXE-файлы с расширением TMP.

При создании исполняемых файлов компиляторы и компоновщики мо-

гут также генерировать соответствующие файлы символов (их расширение 
по умолчанию — PDB). Файлы символов содержат данные, которые не нуж-
ны при запуске исполняемого кода, но могут быть полезны при отладке. Это 
имена и смещения для точек входа функций, содержащихся в модуле. Имея 
эту информацию, отладчику легко, взяв адрес в памяти, найти соответствую-
щую функцию по ближайшему предыдущему адресу. В отсутствие символов 
отладчику приходится пользоваться экспортируемыми функциями (если 
таковые есть), которые могут и не иметь никакого отношения к коду, кото-
рый нужно исследовать. В целом, чем больше смещение адреса возврата, тем 
меньше вероятность того, что вы нашли нужное имя функции.

 Примечание 

Утилиты Sysinternals способны использовать только «родные» (неу-

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

Символьный файл должен генерироваться одновременно с соответству-

ющим исполняемым файлом, иначе подсистема отладки откажется исполь-
зовать его. Прежние версии Microsoft Visual C++ создавали файлы символов 
только для отладочных сборок, пока разработчик не отключал эту функцию 
вручную. Более новые версии в настоящее время создают символьные фай-
лы и для окончательных сборок, записывая их в одну папку с исполняемыми 
файлами. Microsoft Visual Basic 6 может создавать символьные файлы, но не 
делает этого по умолчанию.

Информация в файле символов может быть в разной степени подробной. 

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

SIN_ch_02.indd   27

27.12.2011   14:12:06


background image

28  Часть 

I   

Приступая к работе

Средства отладки Windows позволяют загружать нужные файлы симво-

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

У Microsoft есть веб-сервер, с которого можно скачать открытые сим-

вольные файлы Windows. Установив средства отладки Windows и настроив 
утилиты Sysinternals для использования сервера символов Microsoft, вы без 
труда узнаете, какие функции Windows вызывают ваши процессы. 

Рис. 2-5.  Стек вызовов в Process Monitor с информацией из символьных файлов

На рис. 2-5 показан стек вызовов для события, захваченного утилитой 

Process Monitor. Присутствие в стеке MSVBVM60.DLL (фреймы 15 и 17-21) 
указывает на то, что это Visual Basic 6, поскольку MSVBVM60.DLL является 
библиотекой времени выполнения Visual Basic 6. Большие смещения фрей-
мов MSVBVM60 говорят о том, что для этого модуля символы не доступны, 
а отображаемые имена не являются реальными именами вызываемых функ-
ций. Фрейм 14 отражает вызов функции Forml::cmdCreate. Щелкните глав-
ный исполняемый файл (LuaBugs_VB6.exe). Этот фрейм также содержит 
путь к исходному файлу. Это говорит о том, что перед нами полные данные 
символов для данного модуля, созданного сторонним разработчиком. Затем 
эта функция вызывает CWshShelbRegWrite из Wshom.ocx (фрейм 13), зна-
чит эта программа, написанная на Visual Basic 6, использует Windows Script 
Host и ActiveX для записи в реестр. CWshShelkRegWrite вызывает вну-
треннюю функцию из того же модуля (фрейм 12), а тот — документирован-
ную API-функцию Windows RegCreateKeyExA из Kernel32.dll (фрейм 11). 

SIN_ch_02.indd   28

27.12.2011   14:12:07


background image

Основные понятия Windows  

Глава 2  29 

Управление передается через внутренние функции Kernel32 (фреймы 8-10) 
системной API-функции ZwCreateKey из Ntdll.dll (фрейм 7). Таким образом, 
все эти функции были выполнены в пользовательском режиме, о чем свиде-
тельствует буква U в столбце фреймов, однако во фрейме 6 программа пере-
ключилась в режим ядра, о чем свидетельствует буква K. Двухбуквенные 
префиксы функций ядра (фреймы 0-6) обозначают компоненты исполняю-
щей системы, к которым они принадлежат. Например, Cm относится к дис-
петчеру конфигураций, отвечающему за реестр, а Ob — к диспетчеру объек-
тов. Трассировка стека была записана во время обработки CmpCallCallBacks 
(фрейм 0). Обратите внимание, что символы в фреймах 0-13 были взяты ис-
ключительно из открытых символов Windows, загруженных по требованию 
программой Process Monitor с сервера символов Microsoft.

Настройка символов

Утилиты Sysinternals, использующие символы, требуют два вида инфор-
мации (рис. 2-6): путь к файлу Dbghelp.dll и путь к символам. Утилиты 
Sysinternals, которые могут использовать полную символьную информацию 
для отображения исходных файлов, запрашивают также пути к исходным 
кодам.

Dbghelp.dll — это одна из библиотек механизма отладки Microsoft. Она 

обеспечивает поддержку прохода по стеку, загрузки системных файлов и 
разрешения адресов памяти в имена функций. Только версия Dbghelp.dll, по-
ставляемая со средствами отладки Windows, поддерживает загрузку файлов 
с серверов символов. Версия Dbghelp.dll, которая поставляется с Windows в 
каталоге %SystemRoot%\System32, может использовать только локальные 
символьные файлы. При первом запуске утилиты Sysinternals проверяют 
пути по умолчанию к средствам отладки и, обнаружив файл Dbghelp.dll, ис-
пользуют его, либо, в противном случае, файл из %SystemRoot%\System32.

Рис. 2-6.  Диалоговое окно настройки символов в Process Explorer

Вот URL для загрузки средств отладки (Debugging Tools) Windows: http://

www.microsoft.com/whdc/devtools/ debugging/defaultmspx. Раньше установ-
щик средств отладки был доступен для загрузки в виде отдельного файла, но 
сейчас он входит в пакет Windows SDK. Для использования средств отладки 
нужно запустить скачанный установщик и выбрать нужные средства отлад-

SIN_ch_02.indd   29

27.12.2011   14:12:07


background image

30  Часть 

I   

Приступая к работе

ки. Пакет содержит свободно распространяемые средства (в виде отдельных 
файлов для платформ x86, x64 и IA64). Свободно распространяемые пакеты 
удобны для установки отладчика на другие компьютеры по сети, т.к. они по-
зволяют не запускать установку полного SDK на каждом компьютере.

Путь к символам указывает механизму отладки, где искать символьные 

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

Путь к символам может включать системные папки и директивы сервера 

символов. При первом запуске утилиты Sysinternals получают путь к фай-
лам символов из переменной окружения _NT_SYMBOL_PATH. Если эта 
переменная не определена, используется путь srv*http://msdl.microsoft.com/
download/symbols, 
т.е. сервер открытых символов Microsoft, но загруженные 
символьные файлы при этом не сохраняются в локальном кеше.

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

в пути одновременно, будучи разделенными точкой с запятой. Очередность 
просмотра элементов пути определяется их порядком. Так, директивы сер-
вера символов имеют следующий вид: srv*DownstreamStore*SymbolServer, 
а вот пример пути к файлам символов:

C:\MySyms;srv*C:\MSSymbols*http://msdl.microsoft.com/download/symbols

Механизм отладки сначала ищет символы в каталогах по умолчанию, за-

тем в C:\MySyms (там удобно хранить закрытые файлы символов созданных 
вами программ). Если символьный файл не найден, механизм отладки ищет 
его в C:\MSSymbols, если файла нет и там, он отправляет запрос серверу 
символов. Если нужный файл есть на сервере символов, механизм отладки 
загружает его в C:\MSSymbols.

Подробнее о путях, серверах символов, исходных путях и переменных 

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

  Совет 

Если вам нужны только открытые символы, установите такой путь:

 srv*c:\symbols*http://msdl.mi 

crosoft.com/download/symbols

В этом случае механизм отладки сначала будет искать символы в C:\Symbols (меха-
низм отладки создает ее, если она не существует). Затем, по мере необходимости, 
символьные файлы будут загружаться с сервера открытых символов Microsoft. Загру-
женные файлы записываются в кеш, чтобы не приходилось загружать их снова.

Сеансы, оконные станции, рабочие столы 
и оконные сообщения

В описании ряда утилит Sysinternals, в том числе Process Explorer, Process 
Monitor, PsExec, Adlnsight, Desktops и LogonSessions, упоминаются сеансы 

SIN_ch_02.indd   30

27.12.2011   14:12:07


background image

Основные понятия Windows  

Глава 2  31 

служб терминалов, идентификаторы сеансов, «консольный сеанс» и «се-
анс 0»; интерактивные и неинтерактивные оконные станции, а также про-
чие программы, запускаемые «с того же рабочего стола». Мало кто знает об 
этом, но эти понятия могут иметь ключевое значение для решения проблем 
в Windows.

Для начала рассмотрим схему на рис. 2-7, а затем определимся с термина-

ми. На внешнем уровне находятся сеансы служб терминалов (TS). Каждый 
сеанс содержит одну или более оконных станций, содержащих рабочие сто-
лы. Каждый из этих защищаемых объектов располагает ресурсами, предна-
значенными для его индивидуального использования. Эти объекты связаны 
произвольными отношениями с сеансами, которые создаются LSA после 
локального входа в систему. Хотя в документации Windows не всегда прово-
дится четкое различие между сеансами LSA и сеансами служб терминалов, 
они являются совершенно разными объектами.

mswindowstation

Сеанс

0

Services-0x0-3E7$

Services-0x0-3E5$

Services-0x0-3E4$

WinSta0

Default

Default

Disconnect

Winlogon

MsrestrictedDesk

Default

Default

Default

Disconnect

Winlogon

Desktop1

Disconnect

Winlogon

Default

WinSta0

WinSta0

Сеанс

1

Сеанс

2

Рис. 2-7.  Сеансы, оконные станции и рабочие столы

Сеансы служб терминалов

Службы терминалов поддерживают интерактивные пользовательские сеан-
сы на одном компьютере. Впервые представленные в Windows NT 4.0 Terminal 

SIN_ch_02.indd   31

27.12.2011   14:12:07