Меня всегда поражало построение документации у Microsoft: с одной стороны многое тщательно документировано, но с другой… бывало, что в новом MSDN’е возьмут, да и выкинут формат отладочной информации CodeView, например. Или рассмотрим ситуацию с WinDbg. У отладчика есть свой chm-help, в котором описано множество команд и встроенных расширений, но о языке разметки (Debugger Markup Language - DML), который поддерживается с версии 6.6.07, ничего не описано. Для того, что бы понять, что это такое нужно открыть файл, который располагается в директории установлено отладчика: dml.doc. Здесь я приведу основные выдержки из этого документа, но советую прочитать содержимое dml.doc.
Итак, как понятно из названия, DML это язык разметки вывода отладчика. С помощью DML можно линковать между собой информацию, которую вы считаете связанной, а так же немного «раскрасить» вывод в отладочную консоль. Линковка осуществляется гиперссылками, пример которой можно увидеть при возникновении Bug Check: отладчик выводит ссылку на команду !analyze -v .
Язык DML имеет тэговую разметку, похожую на HTML. Формат тэга следующий:
Описание тэгов DML
Тэг link служит для формирования гиперссылки. Формат тэга:
В результате, в отладочном выводе, будет сформирована гиперссылка. Тест гиперссылки будет соответствовать "link text", а действие при клике соответствует "debugger_command". Действие (команда) может быть любой командой отладчика. Параметры name и section служат для навигации между связанными ссылками.
Тэг exec более простая версия тэга link, который служит для вывода ссылок на команды отладчика в виде гиперссылок. Формат тэга:
Параметр cmd аналогичен тэгу link. С помощью exec можно организовать довольно сложное меню.
Тэги изменения стиля теста: <b>text</b>, <i>text</i>, <u>text</u>. Эти тэги меняют стиль написания текста на жирный, наклонный и подчеркнутый
Тэг изменения цвета текста - col. Формат тэга:
Параметры fg bg задают цвет теста и фона соответственно. Цвета можно выбрать из следующих значений:
wbg, wfg | Системные цвета по умолчанию для теста и фона |
cbg, cfg | Системные цвета по умолчанию для выделенного теста и фона |
changed | Цвет, используемый WinDbg для выделения низменных значений (регистров, переменных). По умолчанию - красный |
srcnum, srcchar, srcstr, srcid, srckw, srcpair, srccmnt, srcdrct, srcspid, srcannot | Цвета, используемые WinDbg для раскраски исходных текстов |
empbg, emphfg | Цвет выделенного текста в Windbg. По умолчанию - голубой |
subbg, subfg | Системные цвета неактивного цвета и фона |
normbg, normfg, warnbg, warnfg, errbg, errfg, verbbg, verbfg | Цвета уровней вывода в WinDbg |
Использование DML
Собственно, фабула. Существует как минимум 3-и основных применения DML:
- скрипты отладчика
- отладочный вывод процесса или драйвера
- библиотеки расширений
Для вывода форматированного текста в скриптах используется токен .print. Для того, что бы выводимый текст интерпретировался как DML, необходимо использовать опцию /D. Например:
Выведет на экран гиперссылку Show debugger version , при клике на которую будет выполнена команда version.
DML можно использовать и в отладочном выводе, который формируется функциями OutputDebugString(…) и DbgPrint(…). Для этого используется ключевой тэг <?dml?>. Часть строки, следующая за этим тэгом, будет трактоваться как DML. Что бы вывести вышеописанный пример из кода нужно:
Разработчиков библиотек дополнений к WinDbg тоже не обделили прелестями DML. Для формирования вывода можно использовать метод IDebugControl::ControlledOutput. Ниже приведен пример функции, написанной на C++, и ее использования. На выходе будет сформирован вышеописанный пример.
void PrintDmlExec(__in PCSTR szCommand, __in PCSTR szText) { CString csDmlCommand; csDmlCommand.Format(_T("<exec cmd=\"%s\">%s</exec>"), szCommand, szText); g_pDbgControl->ControlledOutput( DEBUG_OUTCTL_AMBIENT_DML, DEBUG_OUTPUT_NORMAL, csDmlCommand); } ... PrintDmlExec("version", "Show debugger version"); ...
Переменная g_pDbgControl должна содержать указатель на интерфейс IDebugControl.
Расширение стандартных команд WinDbg DML
Многие стандартные команды были расширены DML’ем, ходя с chm-help’е об этом не сказано. Токен .printf с параметром /D я уже описал выше. Краткое описание других команд:
- .help /D - вывод помощи в виде меню, организованного гиперссылками
- .chain /D - отображение цепочки расширений
- .extmatch /D - вывод расширений, имя которых совпадает с заданной маской
- lmD - отображение списка загруженных модулей. Гиперссылками можно просматривать детализированную информацию о модуле
- kM - отображение стека вызовов. Гиперссылками отображается номер фрейма в стеке.
ΞρεΤΙκ