「Debugging Tools for Windows」(WinDbg、kdなど)といえば、アプリケーションやドライバ開発者が自分で書いたプログラムをデバッグするための、Windows向け開発者専用ツールというイメージがあります。しかし、開発者ではないITプロにとっても、Windowsの動作や仕様の理解、あるいはトラブル解決に役立つことがあります。
筆者が翻訳した『インサイドWindows 第7版 上』(日経BP社刊、Pavel Yosifovich、Alex Ionescu、Mark E. Russinovich、David A. Solomon著)が発売されました。本書は、『Inside Windows NT』(Microsoft Press、1992年、Helen Custer著)から25年以上続いているシリーズの最新版『Windows Internals, Seventh Edition, Part 1』(Microsoft Press、2017年5月)の日本語訳です。筆者は7版で初めてこのシリーズの翻訳を担当させていただきました。はなはだ私事で恐縮ですが、筆者の“日記”なので許してください。
本書は、公開されている、あるいは非公開のWindowsの内部構造や動作仕様について、ここまでもかと深く掘り下げて解説する、800ページを超える長い長い物語です。ただ読み進めるだけでは、全く頭に入ってこないこと確実です。
そこで、本書全体を通して計145の「実習」が用意されており、Windowsの標準ツール(タスクマネージャーなど)、「Windows Software Development Kit(SDK)」や「Windows Driver Kit(WDK)」に含まれる「Debugging Tools for Windows」のデバッガーおよび関連ツール、「Windows Sysinternals」の各ツール、書籍付録のツールを使用して、読者自身でWindowsのさまざまな挙動を体験したり、プロセスやスレッド、それらに関係する構造体を確かめたりすることができます。仮想メモリのアドレスを物理メモリに変換してみるような、面白い実習もあります。
デバッガーの使用は、アプリケーションやドライバの開発者なら慣れたものでしょうが、開発者ではないITプロフェッショナル(インフラ系技術者やシステム管理部門も担当者)にとってはなじみが薄く、「難しそう」「導入が面倒」といったイメージを持っていると思います。Windows SDKやWDKはバージョンごとに用意されているので、確かに導入は面倒です。デバッグ環境の導入方法については、書籍の中でも少ししか触れられていないので、今回は非開発者のITプロフェッショナル向けにどのようなオプションがあるのかを紹介します。
Debugging Tools for Windowsのデバッガー(Windbg.exe、kd.exe、cdb.exe、ntsd.exe)を使用すると、ユーザーモードアプリケーションやカーネルのプロセス/スレッド、あるいはメモリダンプファイル(%Systemroot%\memory.dmpなど)にアタッチし、デバッグコマンドやエクステンションでさまざまな調査を行えます。
「cdb.exe」と「ntsd.exe」はCUIベースのユーザーモードデバッガー、「kd.exe」はCUIベースのカーネルモードデバッガー、そして「WinDbg.exe」はユーザーモードおよびカーネルモードの両方に対応したGUIベースのデバッガーです。Debugging Tools for Windowsの入手方法やインストール後の初期設定(シンボルサーバの設定)などについては、書籍をご覧ください。
ローカルコンピュータでカーネルモードのデバッグを実行するには、Windowsを「デバッグモード」で起動する必要があります。それには、コマンドプロンプトを管理者として開き、次のコマンドラインを実行してコンピュータを再起動します。
bcdedit /debug on
shutdown /r /t 0
WinDbg.exeを使用する場合は、スタートメニューからコンピュータアーキテクチャに一致する「WinDbg(X86)」または「WinDbg(X64)」を管理者として起動し、「File」メニューから「Kernel Debug」を選択し、「Kernel Debugging」ダイアログボックスの「Local」タブを選択して「OK」ボタンをクリックします。
前述のように、Debugging Tools for Windowsを含むWindows SDKやWDKは、Windowsのバージョンごとに用意されているので、目的に合わせてデバッグ環境を準備しなければならず、そこが面倒なところです。
しかし、仮想化が一般になった今では、仮想マシン上にデバッグ環境を準備すると便利です。書籍の「実習」にはデバッガーとデバッギー(デバッグ対象)用に2台のコンピュータを必要とする「実習」もあります。後述するように、その場合も仮想マシン環境に準備すると便利です。
ローカルのカーネルデバッグを実行するには、デバッグモードに切り替えて再起動するというのも面倒です。面倒なだけでなく、トラブルシューティングが目的の場合、デバッグモードで再起動することで、問題が再現しなくなるということもあります。
その場合は、Debugging Tools for Windowsをインストールしたのと同じコンピュータに「Windows Sysinternals」の「LiveKd.exe」(単体またはSysinternals Suiteとして)をインストールしておくと便利です。インストールとはいっても、Zipファイルを解凍して単純にコピーし、システムのPATH環境変数にコピー先のパスを設定するだけのことです。
例えば、64bitカーネルをデバッグする場合は、コマンドプロンプトを管理者として開き、次のいずれかのコマンドラインを実行します。「-k」オプションに続けて、使用したいデバッガーのパスを指定するのです。
livekd -k "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\kd.exe"
livekd -k "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe"
LiveKdを使用してカーネルデバッガーを実行する場合、デバッグ対象はデバッグモードで起動している必要はありません。デバッグを実行している側からは、ローカルデバッグしているように見えますが、実は、LiveKdはカーネルメモリのスナップショットをメモリダンプとして作成し、そのダンプファイルにデバッガーをアタッチしているのです。
デバッグ対象のコンピュータで進行中の挙動は、アタッチしているスナップショットには反映されないことに注意が必要です。その場合、デバッガーを終了すると再実行するかどうかを問われるので、[y]を入力してスナップショットをリフレッシュします(画面1)。
LiveKdにはHyper-V仮想マシンに対し、文字通り「ライブでアタッチする」(スナップショットではなく)機能もあります。LiveKdについてさらに詳しく知りたい方は、『Windows Sysinternals徹底解説 改定新版』(日経BP社刊、2017年、Mark Russinovich、Aaron Margosis 著)をお勧めします。
Copyright © ITmedia, Inc. All Rights Reserved.