知っておくと便利な「Visual Studio 2012」によるドライバのトラブルシューティング:Windows 8 デバイスドライバ開発入門(2)(3/3 ページ)
Windows 8対応のデバイスドライバを開発する際に、“知っておくと便利なポイント”を実践的な観点から紹介する連載「Windows 8 デバイスドライバ開発入門」。第2回では、デバイスドライバのトラブルシューティングついて取り上げる。
3.2.トレースログ取得の開始
トレースログの取得を開始するには、コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行してください。
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、レベル、フラグを指定してください。
3.3.トレースログ取得の停止
トレースログの取得を停止するには、コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行してください。
logman stop <[-n] <name>> [options]
logman stop "sample_trace" -ets
停止コマンドを実行すると、開始コマンドで指定したパス“C:\Users\win7x86\Desktop”に、「KMDFSampleDriver.etl」というファイル名でトレースログが保存されます。
3.4.ETLファイルの変換
トレースログは、ETLというファイル形式で保存されます。このETLファイルはバイナリファイルなので、テキスト形式にしないとエディタなどで読むことができません。
ETLファイルをテキスト形式に変換するには、以下の2つのツールが必要となります。
- tracepdb ……TMFファイルを作成するツール
- tracfmt ……ETLファイルからトレースログ(テキスト形式)を取り出すツール
これらは、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で実施することが可能です。
4.必殺!! ダンプファイルからのトレースログ取り出し
カーネルモードのデバイスドライバで致命的なエラーが起きると、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発生時にどのようなシーケンスで処理が実行されたかが分かります。実際に取り出せたときは感動しますので、皆さんもぜひ試してみてください。
今回は、ドライバのトラブルシューティングというテーマで解説しました。今回紹介した内容は、実際に使用しながら覚えるのが一番ですので、ぜひチャレンジしてみてください!
次回は、ちょっと話題を変えて、「ドライバとアプリケーションの通信」について紹介します。お楽しみに! (次回に続く)
謝辞:
今回の寄稿に当たり、記述のチェック、およびアドバイスをしていただいた、サイエンスパークの川出智幸氏、原仁俊氏に感謝致します。
Windows Embedded コーナー
関連キーワード
Windows 8 デバイスドライバ開発入門 | Windows Embedded 関連 | Windows | Windows 8 | 組み込み | Windows Embedded | トラブル | Visual Studio 2012 | トラブルシューティング | ブルースクリーン | アプリケーション開発 | Windows Embedded 8
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 組み込み機器でもWindows 8! 実は使える“8つ”の機能【前編】
「Windows 8」には、従来バージョンから刷新・新規追加されたさまざまな機能が存在する。その中には、“組み込み機器でも!”“組み込み機器だからこそ!!”活用できる機能がある。本特集ではWindows 8にちなんで、組み込み機器で使える“8つ”の機能を紹介。【前編】では、UI周りの外観的な(見える)機能を中心に取り上げる。 - 組み込み機器でもWindows 8! 実は使える“8つ”の機能【後編】
「Windows 8」には、従来バージョンから刷新・新規追加されたさまざまな機能が存在する。その中には、“組み込み機器でも!”“組み込み機器だからこそ!!”活用できる機能がある。本特集ではWindows 8にちなんで、組み込み機器で使える“8つ”の機能を紹介。【後編】では、セキュリティやディスク保護(データ保護)といった内部的な機能を中心に取り上げる。 - Windows 8テクノロジーを継承する組み込み機器向けOSの新機能
マイクロソフトの組み込み機器向けOS「Windows Embedded 8 ファミリ」の1つ、「Windows Embedded 8 Standard」にフォーカスし、“強化された機能”を解説する。