Когда Дейв Соломон (Dave Solomon) и я в 1999 году работали над третьим изданием книги Inside Windows 2000 из серии Windows Internals, мы обдумывали возможность использовать отладчики ядра, такие как Windbg и Kd (часть бесплатного пакета Debugging Tools for Windows, доступного в Windows Platform SDK), для формирования локального интерактивного представления выполняющейся системы. Дейв проводил эксперименты с отладчиками ядра во втором издании, Inside Windows NT, которые иллюстрировали понятия, описанные в книге. Например, глава об управлении памятью описывала базу данных страничных блоков – структуру данных, используемую системой для отслеживания состояния каждой страницы физической памяти; сопутствующие эксперименты показывали, как просмотреть действительную структуру данных и содержимое записей PFN в выполняющейся системе с помощью отладчика ядра. Однако в то время единственным способом использовать Windbg и Kd для просмотра информации ядра было подключение второго компьютера с помощью серийного нуль-модемного кабеля к целевой системе, загруженной в режиме отладки. Необходимость покупки специального серийного кабеля и настройки двух систем для отладки ядра означала, что многие читатели просто пропустят эти эксперименты, однако если бы их было проще выполнить, читатели углубили бы свое понимание концепций, описанных в книге.

После некоторых раздумий, я пришел к мысли, что я мог бы обмануть отладчики, заставив их думать, что они смотрят на файл аварийного дампа, реализовав драйвер фильтра файловой системы, представляющий «виртуальные» файлы аварийного дампа, которые могут быть открыты отладчиками. Так как файл аварийного дампа – это просто заголовок файла, сопровождаемый содержимым в физической памяти, данный драйвер мог бы удовлетворить запрос на чтение виртуального файла дампа с контентом в физической памяти, которые этот драйвер может легко прочитать из объекта раздела \Device\Physical Memory, создаваемого диспетчером памяти. Несколько недель спустя на свет появился LiveKd. Мы расширили число экспериментов с отладчиком ядра в книге и начали использовать LiveKd в наших семинарах Windows Internals. Использование LiveKd не ограничивалось лишь образовательными целями, и на долгое время эта утилита стала неотъемлемой частью инструментария для диагностики проблем для ИТ-профессионалов и инженеров поддержки Microsoft. Microsoft даже добавила возможность локальной отладки ядра в Windows XP, однако LiveKd по-прежнему может выполнять некоторые вещи, которые не поддерживаются стандартными средствами, например, сохранение копии состояния системы в файл дампа, который может быть исследован на другой системе, и отладчик работает на Windows Vista/Server 2008 и выше, не требуя при этом загрузки системы в режиме отладки.

Диагностика виртуальных машин

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

Несколько месяцев назад, я работал с инструментом LiveCloudKd от Матье Сюиша (Matthieu Suiche), который позволяет отлаживать виртуальную машину Hyper-V, и обнаружил, что эта технология многим была интересна. Мы были настолько впечатлены, что пригласили Матье поговорить об отладке ядра в реальном времени с помощью LiveCloudKd на встречу BlueHat Security Briefings, проходившую в этом году в университетском городке Microsoft. Подгоняемый LiveCloudKd, я решил, что пришло время закончить расширение LiveKd и послал электронное письмо Кену Джонсону (Ken Johnson), ранее известному под ником Skywing на Uninformed.org, а ныне разработчику в команде Microsoft, занимающемуся продуктами защиты систем (ранее он публиковал статьи об обнаруженных им дырах в безопасности 64-разрядного ядра Windows «Patchguard», так что мы привлекали его к работе, чтобы сделать Windows более безопасной), в котором я спросил его, заинтересован ли он в сотрудничестве. До этого Кен написал код для LiveKd, который позволил ему запускаться на 64-разрядных системах Windows Vista и Windows 7, так что при его поддержке работа над проектом ускорилась бы. Он ответил, что год назад создал прототип инструмента для отладки виртуальных машин в реальном времени, и думает, что мог бы объединить его с LiveKd за несколько дней. Несколько дней спустя бета-версия LiveKd 5.0 была закончена и обладала полной поддержкой отладки Hyper-V в реальном времени.

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

Отладка Hyper-V с помощью LiveKd

Поддержка Hyper-V в LiveKd предоставляет три новых ключа командной строки: -p, -hv и -hvl.

clip_image001

Когда вы хотите провести диагностику виртуальной машины, используйте -hvl для перечисления списка имен и идентификаторов активных виртуальных машин:

clip_image002

Далее используйте ключ -hv для определения той, которую вы хотите исследовать. Вы можете использовать либо GUID, либо имя виртуальной машины, однако обычно удобнее использовать имя, если оно уникально:

clip_image003

Вот и все. Теперь вы можете выполнять те же самые команды, которые вы использовали в LiveKd на родной системе, выводить список процессов и потоков, делать дамп памяти и генерировать файлы аварийного дампа для последующего анализа.

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

Опция приостановки просто автоматизирует операцию паузы, которую вы можете выполнить в интерфейсе управления Hyper-V Virtual Machine, предоставляя мгновенное представление виртуальной машины, пока вы разбираетесь в проблеме.

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