Перед тем как я расскажу о некоторых новых возможностях, стоит пару слов сказать о новой системе версий WinDbg. Изначально существовал отдельный продукт "Debugging Tools for Windows". Он имел свою линейку версий. Затем Microsoft интегрировали "Debugging Tools for Windows" в WDK и Platform SDK, убрав возможность скачивания отдельного дистрибутива отладчика (что толкнуло меня на ведение коллекции отдельных дистрибутивов "Debugging Tools for Windows"). Следующим шагом (с выходом preview-версии Windows 8) стало появление версии 6.2.xxx.yyy после 6.12.xxx.yyy. То есть Microsoft лишили "Debugging Tools for Windows" собственной версии, а версия WinDbg теперь совпадает с версией операционной системы. Последняя версия (на момент написания) - 6.3.9600.16384, что соответствует Windows 8.1.
Так что же нового предоставляет отладчик версии 6.3.9600 по сравнению с 6.12.xxx.yyy? Для начала стоит ознакомится с официальной документацией:
Так же стоит отметить, что старый отладчик упорно обзывает системы Windows 8 семерками. Плюс, как я писал ранее, отладчик 6.12.xxx.yyy не открывает полные дампы с Windows 8.
Но самое вкусное - расширения. Самые интересные (на мой взгляд), доступные только в новом отладчике:
- !findhandle-поиск описателей на указанный объект. Первый обязательный параметр - адрес объекта. Второй необязательный параметр - адрес процесса, в котором будет происходить поиск. Если второй параметр не задан, то будет произведен поиск во всех процессах.
- !joblist - команда перечисляет все созданные в системе job-объекты. Для каждого job-объекта выводтся информация, аналогичная результату работы команды !job для этого объекта.
- !ptetree - отображения дерева структур памяти.
- !processirps - команда, выделившаяся из общего списка тем, что присутствует в официальной документации.
Есть у нового отладчика и неприятные моменты. Появилась проблема зависания при выходе из отладчика, если в этот момент исполняющееся расширение читает пользовательский ввод. Поясню на примере, исходный код расширения:
extern "C" __declspec(dllexport) HRESULT CALLBACK echo(IDebugClient4 *pClient, PCSTR) { CComQIPtr< IDebugControl > pControl(pClient); for(; ; ) { char buf[MAX_PATH] = {0}; pControl->Input(&buf[0], _countof(buf), NULL); pControl->Output(DEBUG_OUTPUT_NORMAL, ">> %s\n", &buf[0]); } }
Дальше запускаем расширения (!echo) и закрываем отладчик. Старый отладчик закрывается, а новый - зависает. Это приводит к известным проблемам использования !pycmd. Проблема была признана Microsoft'ом, но так до сих пор и не исправлена.
ΞρεΤΙκ