
Фронт-енд на PowerShell для Windows Debugger Engine.
Интерфейс PowerShell для отладчика Windows.
Готовы табулировать свой путь к успеху? Для быстрого знакомства посмотрите Начало работы.
Этот проект не создан, не одобрен и не контролируется командой отладчика Windows.
Команда отладчика приветствует обратную связь по своему API и интерфейсам (windbg, kd и др.), но они не имеют никакого отношения к этому проекту. Не отправляйте ошибки или отзывы команде отладчика касательно этого проекта.
Это не финансируемый проект: ему не выделены официальные ресурсы, над ним работают только добровольцы. Не берите на себя производственные зависимости от этого проекта, если вы не готовы полностью поддерживать его самостоятельно. Не стесняйтесь оставлять Issues и отправлять Pull Requests, но имейте в виду, что из-за ограниченных волонтёрских ресурсов обработка ваших вкладов может занять некоторое время.
Это экспериментальный проект: он не до конца проработан, и вы должны ожидать, что критические изменения будут вноситься часто.
Следствие из вышеуказанных отказов: я бы избегал подключения DbgShell к живым целям высокой ценности.
https://aka.ms/dbgshell-latest
Вы когда-нибудь пытались автоматизировать что-то в отладчике? (cdb/ntsd/kd/windbg) Как успехи?
Основная движущая сила DbgShell — это то, что автоматизировать что-либо в отладчике слишком сложно. Конечно, на сегодняшний день существуют средства для автоматизации отладчика. Но, на мой взгляд, они не удовлетворяют потребностям людей.
Цель проекта DbgShell — принести все преимущества объектно-ориентированного мира PowerShell в мир отладки. Когда вы выполняете 'dt' для дампа 'объекта', вы должны получить реальный объект. Скриптинг должен быть таким же простым, как написание скрипта PowerShell.
Проект DbgShell предоставляет интерфейс PowerShell для dbgeng.dll, включая:
Пользовательский хост по-прежнему является программой на основе командной строки (conhost.exe) (аналогично ntsd/cdb/kd), но его можно вызвать из windbg (!DbgShell).
Помимо значительного упрощения и расширения возможностей автоматизации, он будет решать и другие проблемы, такие как удобство использования для людей, которым не приходится часто использовать отладчики. (одна из жалоб, которую я слышал: «когда мне в конце концов приходится использовать windbg, я провожу всё время в .CHM»)
Для опытных пользователей windbg, с другой стороны, ещё одна цель — сделать переход максимально плавным. Так, например, провайдер пространства имён — не единственный способ доступа к данным; вы по-прежнему можете использовать традиционные команды, такие как "~3 s", "k" и т.д.
Я имею в виду не только то, когда вы открываете текстовый редактор и пишете большой скрипт для выполнения чего-то сложного — я также имею в виду возможность создавать относительно простые вещи прямо в командной строке. Есть много ситуаций, когда вам хотелось бы использовать немного логики, но это не настолько большое или повторно используемое, что вы захотели бы его сохранять. Должно быть легко создавать «однострочники» вроде «остановиться на CreateFile, если открываемый файл находится на рабочем столе пользователя, а функция Blah находится в стеке».
Позвольте мне внести ясность: мне потребовалось примерно 4 года, чтобы «согреться» к PowerShell. Я считаю, что у него есть острые углы, аспекты, которые просто сложны, и множество ошибок как в дизайне, так и в реализации. Иногда это меня очень раздражает. Однако преимущества PowerShell убедительны и убедили меня, что это лучший выбор для этого проекта:
Get-Command, автодополнение по Tab, возможность предоставления иерархических данных, подобных файловой системе, средства для предоставления и синтеза справки — всё это очень хорошо.dt" для «дампа» «объекта» и получение реального объекта. DbgShell это делает.cd" в файловую систему, реестр, AD и т.д.; вы можете выполнять Send-MailMessage, Get-WmiObject, Invoke-WebRequest, Invoke-RestMethod, запускать произвольные программы и т.д.DbgShell долгое время находился в «режиме прототипирования». Я потратил много времени на выяснение того, как что-то могло бы или должно быть сделано, но не обязательно «доделывая» всё. В текущем коде есть огромное количество TODO. Так что, хотя он уже начал становиться полезным, проект всё ещё довольно сырой. Тем не менее, он определённо может продемонстрировать достаточно, чтобы дать вам хорошее представление о том, каким он должен быть.
Ниже приведены несколько скриншотов. Важно отметить, что всё, что вы видите, не является текстовым выводом dbgeng. Хотя некоторые элементы вывода будут выглядеть знакомо, это только потому, что я использовал функции форматирования и вывода PowerShell для настройки отображения определённых объектов — весь вывод, который вы видите, на самом деле соответствует реальным, полноценным объектам .NET. Например, каждое сообщение ModLoad соответствует объекту MS.Dbg.ModuleLoadedEventArgs, который имеет больше свойств, чем отображается при отправке в Out-Default. Никакого синтаксического анализа строк из dbgeng не происходит. (Ну... почти. Я пошёл на несколько компромиссов, где нет другого способа получить информацию. Например, дизассемблирование или разбор символического имени функции-регулятора adjustor thunk для поиска смещения.)
Это своего рода сценарий «hello world»: подключение к экземпляру cmd.exe. Я сначала использую встроенную команду PowerShell Start-Process, затем передаю вывод команде DbgShell Connect-Process, а затем исследую пространство имён:

Здесь я подключился к тестовой программе, посмотрел стек, переключился на конкретный кадр стека, выгрузил локальные переменные, проверил значение локального std::map и проверил некоторую информацию о типе для локального перечисления. Обратите внимание на отображение значения перечисления: DbgShell не только обрабатывает поиск символьного имени для отдельных значений, но и когда несколько значений объединены через OR. По скриншоту этого не видно, но для всех этих элементов есть автодополнение по Tab.

!dbgshell", чтобы открыть консоль DbgShell.Лицензировано в соответствии с MIT.
Этот проект приветствует вклад и предложения. Большинство вкладов требует вашего согласия с Лицензионным соглашением с участником (CLA), которое подтверждает, что вы имеете право и действительно предоставляете нам права на использование вашего вклада. Подробности см. на https://cla.microsoft.com.
Когда вы отправляете запрос на включение (pull request), CLA-бот автоматически определит, нужно ли вам предоставить CLA, и соответствующим образом оформит PR (например, метка, комментарий). Просто следуйте инструкциям бота. Вам нужно будет сделать это только один раз для всех репозиториев, использующих наше CLA.
См. Вклад для получения дополнительной информации о вкладе в проект.
Этот проект принял Кодекс поведения Microsoft Open Source.
Для получения дополнительной информации см. Часто задаваемые вопросы о Кодексе поведения или свяжитесь с [email protected] с любыми дополнительными вопросами или комментариями.
Короткое (3-минутное) видео-введение можно найти здесь: https://youtu.be/ynbg2zZ1Igc