troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

WinDbg の新機能:JavaScript を用いてデバッグ

Windows SDK Preview 14951 より、JavaScript を用いて、WinDbg を用いたデバッグができるようになりました。

Hello World!
JavaScript を用いて、WinDbg に Hello World! を表示するスクリプトを書いてみます。

1. JavaScript のコードを書き、任意のファイルに保存します。
initializeScript() は、スクリプトが読み込まれたときに呼ばれる関数です。
function initializeScript() {
    host.diagnostics.debugLog("***> Hello World! \n");
}

2. WinDbg で、任意のアプリのライブデバッグを開始します。

3. JavaScript を用いたスクリプトを実行させるには jsprovider.dll をロードする必要があります。
.load jsprovider.dll


4. 無事ロードされたかは「.scriptproviders」で確認できます。
.scriptproviders
出力に、「JavaScript (extension '.js')」があればロードされています。


5. 「.scriptload」を用いて、上記 1 で作成した JavaScript のファイルを読み込みます。
.scriptload <スクリプトのパス>
すると、JavaScript が実行され「Hello World!」が表示されます。


JavaScript を用いて、条件付きブレークポイントを実装
JavaScript を用いて、条件付きブレークポイントを実装するスクリプトを書いてみます。

ここでは、環境変数に test が設定されたらブレークする条件付きブレークポイントを実装してみます。(DefragTools で紹介されていたでものです)

前提知識
環境変数を設定する際は Kernelbase!SetEnvironmentVariableW が呼ばれ、x64 環境では rcx レジスタに環境変数が、rdx にその値が格納されます。
例えば、「set myenv=1」を実行すると、rcx に myenv が、rdx に 1 が格納されます。


手順
1. JavaScript のコードを書き、任意のファイルに保存します。
rcx の値 (すなわち環境変数) を、変数 name に格納し、その値が「test」でなかったら、デバッグコマンド「gc」を実施するというスクリプトです。
function invokeScript() {
    var nameAddr = host.currentThread.Registers.User.rcx;
    var name = host.memory.readWideString(nameAddr);
    var valueAddr = host.currentThread.Registers.User.rdx;
    var value = host.memory.readWideString(valueAddr);
 
 
    host.diagnostics.debugLog("Setting '", name, "' to '", value, "'\n");
 
    if (name != "test") {
        host.namespace.Debugger.Utility.Control.ExecuteCommand("gc");
    }
}
invokeScript() は、後述する.scriptrun 実行時に呼ばれる関数です。

2. WinDbg で、cmd.exe のライブデバッグを開始します。

3. JavaScript を用いたスクリプトを実行させるには jsprovider.dll をロードする必要があります。
.load jsprovider.dll

4. 無事ロードされたかは「.scriptproviders」で確認できます。
.scriptproviders
出力に、「JavaScript (extension '.js')」があればロードされています。

5. Kernelbase!SetEnvironmentVariableW が呼ばれた際に、作成したJavaScript が実行されるようにします。
bp Kernelbase!SetEnvironmentVariableW ".scriptrun C:\\bin\\conditionalbp.js"


6. 「set test=5」を実行し、環境変数 test を設定したために、Kernelbase!SetEnvironmentVariableW でブレイクすることを確認します。


7. 「set aaa=5」を実行しても、環境変数 test の設定はしていないため、ブレークしないことを確認します。



情報元
Defrag Tools #170 - Debugger - JavaScript Scripting (英語)
JavaScript Debugger Scripting (英語)

関連記事
Windows 10 SDK のWinDbg からの新コマンド dx
  1. 2016/11/07(月) 22:40:13|
  2. WinDbg
  3. | トラックバック:0
  4. | コメント:0
<<Microsoft よりオープンソースで公開されている Linux 用のネットワークレイテンシー測定ツール:lagscope | ホーム | コマンドプロンプト や PowerShell で全画面表示にする Tips>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/315-d1e31291
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。