Внешний интерфейс PowerShell для отладчика Windows: DbgShell
Life-Hack
Главная причина появления DbgShell – сложности при автоматизации чего-либо в отладчике. Сегодня, конечно же, существуют средства для автоматизации отладчика. Однако я считаю, что они не удовлетворяют потребностям пользователей.
· Использование встроенного скриптового языка устарело, язык сложно понять и получить по нему помощь;
· DScriptнемного точнее, но он практически неизвестен, является низкоуровневым, а также ему не хватает REPL;
· Написание полноценного расширения для отладчикаDLLочень действенно, но является значительным финансовым вложением – оно слишком дорого для разовых задач при отладке случайных, повседневных задач. Несмотря на стоимость, существует огромное количество расширений для отладчика. Не думаю, что их должно быть так много; единственная причина их существования – отсутствие реальных альтернатив;
· Попытки предоставления лучшего интерфейса (такого, как PowerDbg) основаны на веб-извлечении данных и синтаксическом анализе, а это ограничивает (а зачастую вызывает раздражение). Таким образом, эти попытки неспособны оправдать надежды на действительно улучшенный интерфейс (они лишь незначительно лучше);
· Попытки упростить процесс написания расширения для отладчика являются лишь временным решением, отвечающее запросам пользователей; они не решают саму проблему (перечислим основные недостатки: они всё ещё низкоуровневые (приходится работать с COMAPI), и в них отсутствует REPL);
· Команда отладчиков недавно представила создание скриптов Javascript. Javascript лучше и чётче, чем старый язык создания скриптов windbg. Но я считаю, чтоу PowerShell есть свои преимущества, самое главное из которых в том, что нет необходимости использовать оболочку Javascript, ведь PowerShellявляется одновременно и скриптовым языком, и оболочкой.
Задача проекта DbgShell – перенести всё лучшее из объектно-ориентированного PowerShell в технологии отладки.
Когда вы вводите ‘dt’, чтобы удалить ‘объект’, вы должны получить настоящийобъект. Создание скриптов должно быть таким же лёгким, как и написание скриптов PowerShell.
Проект DbgShell предоставляет фронтенд PowerShellдля dbgeng.dll, включая:
· Управляемая “объектная модель” (её можно по желанию использовать в C#), более высокоуровневая, чем dbgeng COM API,
· Навигатор PowerShell, классифицирующий аспекты цели для отладки как пространство имён в иерархическом порядке (вы можете применить команду “cd” к отдельно взятой строке, ввести “dir”, чтобы увидеть стек, ввести “cd”в фрейм, снова применить “dir”, чтобы просмотреть locals/registers/etc),
· cmdletдля работы с целью,
· Настраиваемый интерфейс PowerShell, который позволяет лучше контролировать отладчик CLI, а также обладающий функциями, которые отсутствуют в стандартном интерфейсе powershell.exe (а именно, поддержка разноцветного текста с использованием управляющих символов ANSI (наподобие ISO/IEC 6429)).
Настраиваемый интерфейс – это всё та же программа командной строки (основанная на conhost.exe), аналогичная ntsd/cdb/kd. Он также может быть вызван из windbg (!DbgShell).
В дополнение к упрощению автоматизации, он будет устранять и другие неполадки, что является неоспоримым преимуществом для тех, кому не приходится часто пользоваться отладчиком (однажды мне пожаловались на то, что «при необходимости использовать windbg, всё время уходит на .CHM»)
Для опытных пользователей windbg, дополнительной целью является, напротив, сделать переход как можно более плавным. Так, например, поставщик пространственных имён не является единственным способом получить доступ к данным; вы всё ещё можете использовать обычные команды “~3 s“, “k“ и тд.
Почему именно PowerShell?
Буду откровенным: я «дошёл» до PowerShellпримерно за 4 года. Я знаю, что у него есть острые углы, сложные аспекты, в нём много ошибок как в дизайне, так и в исполнении. Иногда это меня сильно раздражает. Однако, преимущества PowerShellвесьма убедительны, и я убедился, что ничего лучше для проекта мне не найти:
· Это одновременно среда скриптов и командной строки. Такаямногонаправленность приводит к неприятностям вроде необходимости быстро учиться, но в итоге это даже удобно, потому что можно одновременно делать две вещи в командной строке REPL, а также писать полноценные надёжные скрипты.
· В нём есть, что открыть для себя – к примеру, Get-Command, заполнение нажатием кнопки TAB, возможность публиковать данные в иерархическом порядке (как в файловой системе), существование условий для оказания помощи также полезны.
· Заполнение нажатием кнопки TAB. Знаю, это уже было в предыдущем пункте, но эта функция заслуживает отдельного упоминания.
· Объектный конвейер: объектно-ориентированная природа конвейера PowerShellнамного более эффективна и легка в обращении, чем старый способ создания скриптов с помощью строк и синтаксиса. Представьте, как можно “удалить”‘объект’ командой ‘dt’, получая при этом реальный объект. DbgShell именно так и работает.
· Людям он известен: я думаю, количество людей, знающих PowerShell, и/или C#, намного превышает количество людей, знающих техники написания скриптов при помощи windbg. Это значит, что больше людей смогут с лёгкостью «выбрать» отладчик, основанный на PowerShell; это также значит, что когда потребуется помощь, число потенциальных помощников будет больше (для написания скриптов).
· PowerShell– это многофункциональная оболочка: используя DbgShell, вы получаете доступ не только к командам отладки, вы также можете применить “cd” к файловой системе, регистру, ADи тд.; вы можете извлечь Send-MailMessage, Get-WmiObject, Invoke-WebRequest, Invoke-RestMethod, запускать произвольные программы и тд.
Текущий статус
DbgShell долгое времябыл в «режиме прототипа». Я провёл много времени, размышляя, как что-то может или должно быть сделано, но «не до конца». Над существующим кодом нужно ещё много работать. Так что, несмотря на свою пользу, проект ещё очень новый. Тем не менее, он может показать, как всё должно быть в итоге.
Текущие недостатки
· Самый большой недостаток в том, что PowerShell плохо поддерживает режим ядра (Если вы уже в нужном контексте, вы можете отобразить значения, но не можете изменить сам контекст из DbgShell. Пространство имён также не работает.
· Несмотря на то, что вы можете загружать и извлекать привычные расширения для отладки как обычно, всё же есть необходимость в других командах windbg.
· Нет поддержки удалённых устройств: dbgeng API поддерживает подключение к удалённому отладчику. К сожалению, символа и типа информации, которые показывает dbgeng API, недостаточно для нужд DbgShell, поэтому DbgShell использует dbghelp API. К сожалению удалённогоdbghelp не существует. Нам предстоит работа над этой проблемой в команде отладчиков.
Перевод команды Life-Hack => never_minder