カーネルデバッガ「WinDbg」とは何か?
ほぼすべてのWindowsバージョンに付属している「メモ帳」は、多数のWindows APIで構成され、Windowsアプリケーションプログラム、あるいは単に、Windowsアプリケーションと呼ばれています。一方、「メモ帳」は、「プロセス」や「オブジェクト」と呼ばれることもあります。「メモ帳」は「プロセス」?、「メモ帳」は「オブジェクト」? これらの素朴な疑問への回答をとことん用意してくれるのがカーネルデバッガー「WinDbg」です。たとえば、WinDbgは次のような「メモ帳」に関する情報を返してくれます。
Searching for Process with Cid == 144
PROCESS 8118f7b8 SessionId: 0 Cid: 0144 Peb: 7ffdb000 ParentCid: 0864
DirBase: 05d3d000 ObjectTable: e168c638 HandleCount: 76.
Image: notepad.exe
VadRoot 8120b108 Vads 131 Clone 0 Private 3192. Modified 73963. Locked 0.
DeviceMap e25cb380
Token e29d7728
ElapsedTime 00:35:15.682
UserTime 00:00:08.992
KernelTime 00:00:21.781
QuotaPoolUsage[PagedPool] 76428
QuotaPoolUsage[NonPagedPool] 332924
Working Set Sizes (now,min,max) (1717, 50, 345) (6868KB, 200KB, 1380KB)
PeakWorkingSetSize 4533
VirtualSize 112 Mb
PeakVirtualSize 112 Mb
PageFaultCount 77274
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 6874
THREAD ffa6f978 Cid 0144.0a50 Teb: 7ffdf000 Win32Thread: e16b51f8 WAIT: (WrUserRequest) UserMode Non-Alertable
811a0f18 SynchronizationEvent
Not impersonating
DeviceMap e25cb380
Owning Process 8118f7b8 Image: notepad.exe
Wait Start TickCount 557719 Ticks: 3327 (0:00:00:33.317)
Context Switch Count 46802 LargeStack
UserTime 00:00:08.0882
KernelTime 00:00:22.0802
Start Address 0x7c810867
Win32 Start Address 0x0100739d
Stack Init f40fb000 Current f40fac20 Base f40fb000 Limit f40f6000 Call 0
Priority 10 BasePriority 8 PriorityDecrement 0 DecrementCount 16
Kernel stack not resident.
カーネルデバッガー「WinDbg」を定義してみる
カーネルデバッガー「WinDbg」は、「メモ帳」をはじめとするWindowsアプリケーションの公式の表情(ユーザモード)と私的な表情(カーネルモード)を同時に教えてくれる道具です。専門的に言えば、上に示した「メモ帳」プロセスの「UserTime」(公式な時間)と「KernelTime」(私的な時間)の過ごし方を調べるための特殊なプログラムです。上の「UserTime」と「KernelTime」の2つの値を比較してみてください。「メモ帳」は公式の場(UserTime)ではなく、裏方であるWindowsシステムと過ごす私的な時間(KernelTime)の方がはるかに長くなっています。WinDbgは、WindowsシステムとWindowsアプリケーションの関係をとことん教えてくれる無料の高等ツールです。
WinDbgのユーザを考えてみる
WinDbgを使用するユーザは、Windowsシステムの開発者(Microsoftの上級開発者)、デバイスドライバー開発者、システム管理者(各種リーク検出やパフォーマンス監視)、アプリケーション開発者(API分析やデバッグ)、テストエンジニア(各種リークやデッドロックの検出)、サポートエンジニア(各種ダンプファイルの解析)などが考えられます。筆者は、Microsoft社内の上級開発者が使用している事実(WinDbgはWindowsシステム自体の品質向上を支えていること)を重視しています。
アプリケーション開発チームは、カーネルグローバル変数を適切に設定することにより、Windowsシステム自体を高度なテスト・デバッグマシンとして構成し直すことができます。使用中のWindowsシステムを強力なテスト・デバッグマシンに構成し直せば、新たに出荷(納品)するアプリケーションの最終動作確認作業を使い慣れたWindowsシステム上で行うことができます。このレベルでの技術を習得しておけば、ユーザサポート経費を大幅に削減できるはずです。API動作分析や、ヒープ/ハンドルをはじめとする厄介なメモリリーク問題の検出には特に効果を発揮します。クラッシュ時のメモリダンプがその場で取得できるのは言うに及びません。WinDbgはプロ向けの機能を満載している、強力なマルチモード(ユーザモードとカーネルモード両用の)デバッガーです。
WinDbgはMASMとC++の2つの文化を継承するスクリプトエンジンを内蔵しています。WinDbgスクリプトコード(WinDbgアプリケーション)が開発できれば、ユーザモードとカーネルモードのシステム分析作業を自動化できます。一度開発したWinDbgアプリケーションは組織内の関係者間で当然共有できます。WinDbgスクリプティング(WinDbgアプリケーション開発)行為は、Windowsカーネル構造体やカーネル変数を直接プログラミング対象とするため、魅力に富んでいます。その上、今まさに活動中のWindowsカーネルの動きを分析することになりますから、WinDbgスクリプティング(WinDbgアプリケーション開発)は奥が深く、きわめて知的な行為です。
WinDbgカーネルデバッガーは、Microsoft社内の上級開発者向けツールという性格上、新しいWindowsバージョンに対応するように更新されます。この意味では、最も信頼できるWindowsアプリケーションの一つといっても過言ではありません。なお、本連載記事は、WinDbg入門者を対象としており、WinDbgコマンドの具体的な使い方やWinDbgスクリプティング(WinDbgアプリケーション開発)技法にはそれほど触れていません(WinDbgコマンドとWinDbgアプリケーション)。