トレースログの取得を開始するには、コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行してください。
logman create trace <[-n] <name>> [options]
logman create trace "sample_trace" -ow -o C:\Users\win7x86\Desktop\KMDFSampleDriver.etl -p {C5D3D42C-739C-4070-A80B-7BFCE1809134} 0xffffffffffffffff 0xff -nb 16 16 -bs 1024 -mode Circular -f bincirc -max 4096 -ets
2行目以降は全てオプションです。4行目の「-p」オプションで、1.で定義したGUID、レベル、フラグを指定してください。
トレースログの取得を停止するには、コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行してください。
logman stop <[-n] <name>> [options]
logman stop "sample_trace" -ets
停止コマンドを実行すると、開始コマンドで指定したパス“C:\Users\win7x86\Desktop”に、「KMDFSampleDriver.etl」というファイル名でトレースログが保存されます。
トレースログは、ETLというファイル形式で保存されます。このETLファイルはバイナリファイルなので、テキスト形式にしないとエディタなどで読むことができません。
ETLファイルをテキスト形式に変換するには、以下の2つのツールが必要となります。
これらは、WDK 8.0(Windows Driver Kit 8.0)をインストールした際に、どちらも“%PROGRAMFILES%\Windows Kits\8.0\bin”にコピーされます。これら2つのツールを使用し、以下のコマンドでETLファイルをテキスト形式に変換します。
tracepdb [-f PDBFiles] [-s] [-p TMFDirectory] [-v] [-c] tracefmt [EtlFile | -rt SessionName][-tmf TMFFile | -p TMFPath ] [Options]
tracepdb -f KMDFSampleDriver.pdb tracefmt KMDFSampleDriver.etl -p C:\Users\test\Desktop -o KMDFSampleDriver.out
変換すると、トレースログはテキスト形式で「KMDFSampleDriver.out」に保存されます。この変換作業は、テストPC(ドライバがインストールされているPC)上で実施する必要はなく、解析用のPCで実施することが可能です。
カーネルモードのデバイスドライバで致命的なエラーが起きると、BSODが発生することは先ほど説明した通りです。BSODが起きるとダンプファイルが作成され、ドライバ開発者はダンプファイルを基に解析作業を行います。
ダンプファイルを見てみると、BSOD発生時に実行されていたスレッドが特定できます。例えば、解析の結果、ポインタに不正な値が入っていて、そこを参照したことが原因でBSODが発生したとしましょう。
しかし、そもそもなぜポインタに不正な値が入ったのでしょうか? そのポインタの値が、複数のスレッドで読み書きされるようなものであった場合、現象発生時に、一体どのようなシーケンスで読み書きが行われ、最終的に不正な値が入ってしまったのかが知りたいはずです。
このような場合、もちろんダンプファイルからその経緯を特定することもできますが、100%特定できるわけではありません。そのような場合、「トレースログで現象発生時のシーケンスが取れたらな」と思うことがありますが、トレースログ取得中にBSODでPCが強制終了してしまったら……。トレースログは一体どうなるのでしょうか?
ご安心ください。実はダンプファイルからトレースログを復活させることができるのです! 以下でその方法を紹介します。
まず、ダンプファイルを用意します(注3)。
注3:BSOD発生時に、「3.2.イベントトレースの開始」の方法でトレースログ取得中であることが前提です。
前項でも説明しましたが、Visual Studio 2012から次の方法でダンプファイルを開きます。ドライバのプロジェクトファイル(.sln)を開き、メニューから[ファイル]―[開く]―[Crash Dump...]で、ダンプファイル(MEMORY.DMP)が存在するパスを指定します。
次に、以下のコマンドを実行して、ダンプが取られたときに動いていたETWロガーの一覧を表示します。
!wmitrace.strdump
ETWロガーの一覧から、自分のドライバのIDを探します。上の画面(図6)では、「0x12」が該当IDであることが分かります。
次に、以下のコマンドでダンプファイルからトレースログファイルを作成します。
!wmitrace.logsave <保存するファイルのパス。拡張子は.etl>
!wmitrace.logsave 0x12 C:\Users\test\Desktop\KMDFSampleDriver.etl
後は、「3.4.ETLファイルの変換」の方法で、ETLファイルをテキスト形式に変換すれば、BSOD発生時にどのようなシーケンスで処理が実行されたかが分かります。実際に取り出せたときは感動しますので、皆さんもぜひ試してみてください。
今回は、ドライバのトラブルシューティングというテーマで解説しました。今回紹介した内容は、実際に使用しながら覚えるのが一番ですので、ぜひチャレンジしてみてください!
次回は、ちょっと話題を変えて、「ドライバとアプリケーションの通信」について紹介します。お楽しみに! (次回に続く)
今回の寄稿に当たり、記述のチェック、およびアドバイスをしていただいた、サイエンスパークの川出智幸氏、原仁俊氏に感謝致します。
Copyright © ITmedia, Inc. All Rights Reserved.