
Windowsデバッガエンジン用のPowerShellフロントエンド。
Windowsデバッガエンジン向けのPowerShellフロントエンド。
タブ補完を使って快適に操作してみませんか? 早速始めるには、はじめに をご覧ください。
このプロジェクトは、Windowsデバッガチームによって制作、承認、監視されたものではありません。デバッガチームはAPIやフロントエンド(windbg、kdなど)に関するフィードバックを歓迎していますが、このプロジェクトとは一切関係がありません。このプロジェクトに関するバグやフィードバックをデバッガチームに報告しないでください。
これは資金提供を受けたプロジェクトではありません。公式に割り当てられたリソースはなく、ボランティアによってのみ開発されています。自分自身で完全にサポートする意思がない限り、このプロジェクトにプロダクション依存関係を持たせないでください。Issueの報告やPull Requestの提出は自由ですが、ボランティアリソースが限られているため、対応には時間がかかる場合があることを理解してください。
これは実験的なプロジェクトです。完全に完成しておらず、破壊的な変更が頻繁に行われることを想定してください。
上記免責事項の帰結:私はDbgShellを高価値のライブターゲットにアタッチすることを避けるべきです。
https://aka.ms/dbgshell-latest
デバッガ(cdb/ntsd/kd/windbg)で何かを自動化しようとしたことはありますか? うまくいきましたか?
DbgShellの主な動機は、デバッガでの自動化がとにかく難しすぎるということです。もちろん、現在でもデバッガの自動化を支援する機能は存在します。しかし、私の意見では、それらは人々のニーズを満たしていません。
DbgShellプロジェクトの目標は、オブジェクトベースのPowerShellの世界の良さをデバッグの世界に持ち込むことです。 'dt'で'オブジェクト'をダンプするとき、実際のオブジェクトを取得できるべきです。スクリプト作成はPowerShellスクリプトを書くのと同じくらい簡単であるべきです。
DbgShellプロジェクトは、以下を含むdbgeng.dll用のPowerShellフロントエンドを提供します:
カスタムホストは依然としてコマンドラインプログラム(conhost.exeベース)です(ntsd/cdb/kdに類似)。ただし、windbgから(!DbgShell)起動することもできます。
自動化をはるかに簡単で強力にするだけでなく、他の懸念事項にも対応します。例えば、デバッガを頻繁に使用する必要がない人の使いやすさなどです。(聞いた不満の一つは、「windbgを使わざるを得なくなったとき、.CHMで時間をすべて費やしてしまう」というものです。)
一方、熟練したwindbgユーザーにとっては、移行を可能な限りシームレスにするという別の目標もあります。例えば、名前空間プロバイダだけがデータにアクセスする唯一の方法ではなく、"~3 s"や"k"などの従来のコマンドも引き続き使用できます。
私が言っているのは、テキストエディタを開いて複雑なことをする大きなスクリプトを書くというだけでなく、比較的簡単なことをコマンドラインで直接素早く作成できることも含まれます。少しのロジックを使いたいが、保存したいほど大きくも再利用可能でもない状況はたくさんあります。「開かれているファイルがユーザーのデスクトップ上にあり、関数Blahがスタック上にある場合にCreateFileでブレークする」といった「ワンライナー」を簡単に作れるべきです。
はっきり言っておきます:PowerShellに「慣れる」のに約4年かかりました。扱いにくい部分、単純に難しい面、設計と実装の両方に多くのバグがあると感じています。時々本当にイライラします。しかしながら、 PowerShellの利点は魅力的であり、このプロジェクトに最適だと確信させてくれました。
Get-Command、タブ補完、ファイルシステムのような階層データを公開する機能、ヘルプの提供と統合の機能などは非常に優れています。dt"で"オブジェクト"を"ダンプ"して、実際にオブジェクトを取得することを想像してみてください。DbgShellはそれを実現します。cd"して移動できます。Send-MailMessage、Get-WmiObject、Invoke-WebRequest、Invoke-RestMethodを実行したり、任意のプログラムを実行したりすることもできます。DbgShellは長い間「プロトタイピングモード」にあります。何かをどのように、またはどのように行うべきか考えることに多くの時間を費やしてきましたが、必ずしもすべてを「完成」させたわけではありません。現在のコードには膨大な数のTODOがあります。そのため、実際に役立つようになってきましたが、プロジェクトはまだかなり未熟です。しかし、どのようなものになるかの良い味わいを提供するのに十分なデモンストレーションができます。
以下にいくつかのスクリーンショットを示します。表示されているものはすべてdbgengのテキスト出力ではないことに注意してください。出力の中には見慣れたものもあるかもしれませんが、それはPowerShellの書式設定と出力機能を使用して特定のオブジェクトの表示をカスタマイズしているからです。表示される出力はすべて、実際の完全な.NETオブジェクトに対応しています。例えば、それらのModLoadメッセージはそれぞれMS.Dbg.ModuleLoadedEventArgsオブジェクトに対応しており、Out-Defaultに送信されたときに表示されるよりも多くのプロパティを持っています。dbgengからの文字列解析は一切行われていません。(いや、ほとんど。情報を得る他の方法がない場合、いくつかの妥協をしました。例えば、逆アセンブルや、アジャスタサンク関数のシンボル名を解析してオフセットを見つけるなどです。)
これは一種の「Hello World」シナリオです。cmd.exeのインスタンスにアタッチします。最初にPowerShellの組み込みコマンドStart-Processを使用し、その出力をDbgShellコマンドConnect-Processにパイプし、その後名前空間を探索します:

ここではテストプログラムにアタッチし、スタックを表示し、特定のスタックフレームに切り替え、ローカル変数をダンプし、ローカルstd::mapの値を検査し、ローカルenum値の型情報を検査しました。列挙値の表示に注目してください。DbgShellは単一の列挙子のシンボル名の検索を処理するだけでなく、複数の列挙子がORで結合されている場合も処理します。スクリーンショットからはわかりませんが、これらすべてにタブ補完が利用できます。

!dbgshell"を実行するとDbgShellコンソールが開きます。MITライセンスの下で提供されています。
このプロジェクトはコントリビューションと提案を歓迎します。ほとんどのコントリビューションには、あなたのコントリビューションを使用する権利を私たちに与える権利があること、そして実際に与えることを宣言するContributor License Agreement(CLA)に同意する必要があります。詳細については、https://cla.microsoft.comをご覧ください。
プルリクエストを送信すると、CLA-botが自動的にCLAを提供する必要があるかどうかを判断し、PRに適切にラベルやコメントを付けます。ボットの指示に従ってください。この操作は、当社のCLAを使用するすべてのリポジトリで一度だけ必要です。
プロジェクトへのコントリビューションの詳細については、Contributingを参照してください。
このプロジェクトは、Microsoft Open Source Code of Conductを採用しています。
詳細については、Code of Conduct FAQを参照するか、追加の質問やコメントがある場合は[email protected]までお問い合わせください。
短い(3分)ビデオ紹介はこちら:https://youtu.be/ynbg2zZ1Igc