WinDBG
Эта страничка содержит краткую статью о чём-то, что должно быть описано гораздо более подробно.
Если вам ещё что-либо известно об этом, то вы ПРОСТО ОБЯЗАНЫ добавить сюда свою информацию. Если вы не уверены в том, что сможете правильно отформатировать или стилизовать свой текст, то добавьте свой материал на страницу обсуждения или на эту страницу, и вам непременно помогут другие пользователи. |
Содержание
Введение
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'. Исследуя листинг обратной трассировки вы сможете обнаружить вызов вспомогательного класса, увидеть, что он запускается в асинхронном режиме, и установить дополнительные точки останова, чтобы можно было увидеть, как он вызывается.
Ссылки
- http://msdn.microsoft.com/en-us/library/ff540507.aspx
- http://www.osronline.com/ddkx/ddtools/gflags_7u5v.htm
- http://blogs.msdn.com/b/ntdebugging/archive/2012/04/30/updated-archive-of-the-ntdebugging-twitter-debug-tips.aspx
Полезные команды
команда | описание |
---|---|
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 (вы можете проверить это довольно легко — просто убедитесь, что прерывание выполнения произошло сразу после смены разрешения монитора и появления цвета фона рабочего стола.