WinDBG

Материал из Русский WINE
Перейти к: навигация, поиск
Эта страничка содержит краткую статью о чём-то, что должно быть описано гораздо более подробно.

Если вам ещё что-либо известно об этом, то вы ПРОСТО ОБЯЗАНЫ добавить сюда свою информацию. Если вы не уверены в том, что сможете правильно отформатировать или стилизовать свой текст, то добавьте свой материал на страницу обсуждения или на эту страницу, и вам непременно помогут другие пользователи.

Введение

WinDBG (произносится как "Wind bag") это инструментарий для отладки, созданный Microsoft. Высокий уровень совместимости ReactOS с Windows и возможность компиляции ReactOS при помощи компилятора от Microsoft позволяет использовать WinDBG для отладки ядра и компонентов, работающих пользовательском режиме системы.

Прежде всего пользователю необходимо скомпилировать ReactOS из исходных кодов при помощи инструментария от Microsoft. При этом будут созданы исполняемые файлы и символы отладки Program DataBase Symbols (PDB), используемые WinDBG для отладки кода. Кроме того, как минимум потребуется скачать cmake и ninja (см. Среда сборки), и версия компилятора от Microsoft (он входит в состав версий Visual Studio).

Пользователь должен создать образ загрузочного диска (bootcd) используя инструментарий Microsoft, а затем загрузить его в виртуальной машине. В самом начале загрузки вы, скорее всего, увидите просто чёрный экран, это нормально, поскольку ядро ReactOS ожидает присоединения к нему WinDBG, после чего процесс загрузки будет продолжен. Подключение к виртуальной машине производится при помощи именованного канала. На странице отладка имеются рекомендации по настройке и подключению к ВМ при помощи именованного канала. В WinDBG в меню выберите File->Kernel Debug (или нажмите ctrl+K), COM, установите соответствующий флаг (я также установил переподключение), и в качестве порта укажите имя канала, т.е., \\.\pipe\ros_pipe.

ReactOS подключится и начнёт установку, так что установите её и перезагрузите машину для перехода ко второй стадии установки. Для использования WinDBG, в меню загрузчика freeloader выберите ReactOS (Debug) (и вновь система не будет загружаться ожидая соединения с отладчиком). Не забывайте, что при подключенном WinDBG ReactOS загружается и работает значительно медленнее.

Для начала отладки ядра нажмите ctrl+break в графическом интерфейсе WinDBG (или ctrl+c если пользуетесь версией для командной строки), кроме того, для перехода к отладке можно нажать tab+k в ReactOS. Теперь вы можете устанавливать точки останова и производить пошаговую отладку кода, но до начала полноценной работы необходимо сделать ещё кое-что. Для перезапуска машины используется команда 'g'.

Символы

Использование символов совместно с WinDBG делает работу с отладчиком значительно более удобной, и пользователь может настроить их использование в отдельности для каждого отдельного экземпляра WinDBG или глобально при помощи переменных окружения. Вначале рассмотрим способ с установкой переменных окружения.

Установим _NT_SYMBOL_PATH в значение C:\path\to\reactos\output-VS11-i386\reactos

Иногда бывает удобно использовать ещё и символы от Microsoft, это не представляет проблемы и не будет иметь никакого отрицательного эффекта, так что вместо указанного выше нужно использовать

C:\path\to\reactos\output-VS11-i386\reactos;SRV*c:\path\to\Document\symbols\*http://msdl.microsoft.com/download/symbols

Исходный код

Для прерывания выполнения кода и работы с полноценным кодом на C, в меню File->Open Source File (ctrl+o) выберите файл с кодом ядра. Работа в пользовательском режиме имеет свои особенности, о которых рассказано в самом низу этой страницы.

Изучение в Windows

ReactOS имеет своей целью обеспечение совместимости с Windows (текущей целью является Server 2003) практически всех приложений, драйверов и даже dll, поэтому требуется изучать поведение обеих систем. WinDBG может помочь и в этом, давая подсказки о том, как в Windows выполняются те или иные операции.

Например: Имеющаяся на данный момент в ReactOS функция копирования и вставки поддерживается при помощи стандартного контекстного меню, в Windows же, выполнение переходит в контекстное меню лишь в самом начале, после чего происходит переход к обработчику функции drag and drop. Тем самым уменьшается объём необходимого для работы этих функций кода (не нужно всё писать дважды). Так что давайте посмотрим, может ли это оказаться полезным нам.

Запустите WinDBG в Windows и удостоверьтесь, что система настроена на использование сервера символов Microsoft (см. выше). Теперь, подключитесь к процессу Проводника (F6, затем выберите explorer). Мы хотели бы увидеть, как производится операция копирования и вставки файла при помощи контекстного меню (или ctrl+c, ctrl+v). Обратившись к MSDN становится ясно, что до Vista для этого использовалась функция SHFileOperation, а в Vista и более поздних версиях системы используется IFileOperation::CopyItems. SHFileOperation находится в shell32 и имеет две версии: unicode и ansi, поэтому устанавливаем точку останова на версию для unicode командой

bp SHELL32!SHFileOperationW

С Vista это будет чуть посложнее, поскольку IFileOperation представляет собой интерфейс, и для установки точки останова нам нужен его класс. Используя x SHELL32!*::CopyItems мы узнаём, что этот класс называется (что довольно логично) CFileOperation, и теперь мы можем установить точку останова на нём командой

bp SHELL32!CFileOperation::CopyItems

Теперь перезапустим Проводник командой 'g', а затем скопируем и вставим файл. Процесс должен прерваться и вы можете просмотреть вывод обратной трассировки командой 'k'. Исследуя листинг обратной трассировки вы сможете обнаружить вызов вспомогательного класса, увидеть, что он запускается в асинхронном режиме, и установить дополнительные точки останова, чтобы можно было увидеть, как он вызывается.

Ссылки

Полезные команды

команда описание
kp обратная трассировка
ta трассировка к адресу;
x *! полный список модулей (в настоящее время lm показывает список тоько базовых модулей);
!drvobj <driver_object address> 0x7 получение подробной информации об объекте-драйвере - запуск/выгрузка + обработчики прерываний
!gflag +soe перехват всех исключений (поддержка первого исключения) отдельно от STATUS_PORT_DISCONNECTED или если код исключения не является кодом ошибки;
!gflag +hpa enable page heap flag turns on page heap verification, which monitors dynamic heap memory operations;
!process 0 0 вывод списка всех процессов с базовой информацией;
!process <addr> 0x1e вывод списка с подробной информацией о присоединённых процессах с их потоками;
!process <addr> 0x1f вывод трассировки стека для всех потоков процесса;
.process <addr> присоединение к процессу по заданному адресу;
!thread <addr> вывод информации о потоке;
.thread <addr> присоединение к потоку по заданному адресу;
.reload /user перезагрузка пользовательского набора символов

Точки останова в режиме пользователя

Когда WinDbg подключен в режиме отладки ядра, то не так-то просто установить точку останова в коде, работающем в режиме пользователя. Поскольку у каждого процесса имеется своё собственное адресное пространство, отладчик просто не знает, в каком из процессов ему необходимо установить точку останова, и команда .process не может помочь в решении проблемы (.process /i конечно может помочь, но ReactOS пока ещё её не поддерживает). Временным решением может стать установка точки останова в режиме ядра (на них всегда можно полагаться), и она сработает в контексте процесса в пользовательском режиме.

Например, по команде

bm win32k!NtUserCreateWindowEx

произойдёт прерывание выполнения программы при создании окна*. Выполнив команду .reload /user после срабатывания точки останова вы сможете увидеть обратную трассировку (она будет включать в себя правильные символы пользовательского режима) и проверить, находитесь ли вы в нужном процессе в нужное время выполнения. Как только это произошло, вы можете расставить точки останова пользовательского режима в контексте этого процесса и начать его подробное изучение.


*при отладке проблем, возникающих при загрузке ОС, убедитесь, что отладчик перехватил выполнение после того, как выла загружена win32k (вы можете проверить это довольно легко — просто убедитесь, что прерывание выполнения произошло сразу после смены разрешения монитора и появления цвета фона рабочего стола.

Смотрите также

ReactOS
Search.png
Доклады
О ReactOSARWINSSЧеЗа
Информация Новости Выпуски новостейПереводы блоговНовости проектаВидеоReactOS на ХабреUSB от Вадима Галянта
Разработка Руководство по программированиюОтсутствующая функциональностьВетви разработкиКомпоненты системыReactOS и WineПлан работRoadmap ядра by VgalРазработчикиСовместимость с dll WindowsНаиболее значимые изменения за годИспользуемые проектыGoogle Summer of CodeИзвестные проблемы
Порты AMD64ARMXboxPowerPC
Компоненты Файловые системыРежим совместимостиОтчеты об ошибкахПечатьUSBЯдро
Загрузчик Восстановление MBRЗагрузка из GRUBПараметры загрузки
Прочее ARWINSSПриложения в ReactOSОформление ReactOSКоординаторы"Пасхальные яйца"Монетизация
Другое Типы ядерFreeWin95
Помощь
RAM-диск ReactOS по PXEс жесткого диска
Разработка Стиль написания кодаСтандарты RC-файловРабота с документациейВенгерская нотацияGNU Indent • [ Subversion : ветвислияниеиспользование TortoiseSVN ] • Основы переводаОтправка патчей
Репорты Отладка в VirtualBoxОтладка на экранДобавление программы в менеджер приложенийОтправка отчетов
Отладка Com0comGDBKdbgRossym.gdbRoswin.gdbWinDBGРуководство по WinDBGВключение трассировки ядраКоды DPRINTУдалённый отладчик ReactOS
Сборка CMakeRBuildФайлы RBuildАвтоматическое копирование файловСборка MINGW-w64Сборка модулейСреда сборки
Тестирование VirtualBoxVMwareQEMUHyper-VНеобходимый объём дискаПеренос файлов на виртуальный дискУстановка ReactOSУстановка драйверов
Сеть Общие папкиSambaNFS
Игры Установка DirectPlay
Обновление ReactOSЗагрузочная флешкаЧем можно помочь проектуСоздание нового пользователяЗвук и сеть в VirtualBoxСъемка и публикация видеоIRC-каналСторонние компонентыFAQReactOS как рабочая станцияReactOS и UEFI
Обзоры ОболочкаNTVDMWOWCommunity EditionИстория сайтаReactOS ServerКриптографияПО времен XP