2011/01/30

Event Tracing For Windows

Event Tracing for Windowsは、Windows XPのころに導入されたトレース、ログ機能だ。カーネル、デバイスドライバ、アプリケーションから利用可能だが、主には、カーネルやデバイスドライバから利用されることが前提の機能だ。

トレースはセッションに記録される。トレースを残す側は、ETWのAPIを使ってトレースをセッションに記録する。セッションは、トレースを記録する側とは無関係に構成することができる。セッションは、トレースを記録するトレースバッファを持ち、トレースバッファの内容は定期的にファイルへ書き出される。トレースを記録するセッションが設定されていない場合、そのトレースはどこにも残らないため、オーバーヘッドが小さい。トレースを残したいと思ったときだけ、そのトレースを記録するセッションを構成すればよいのだ。このセッションの構成やファイルの設定は、トレースを記録する側とは独立に設定できるため、なかなか便利なのだ。

実は、Windowsカーネル内のコンテクスト切り替え、ディスクI/O、ネットワークの送受信、I/O割り込みといったイベントは、ETWでトレースされている。よって、しかるべきセッションを設定してやれば、これらのイベントの様子を記録することができる。興味のある方は、こちらを。

最近のWindowsでは、障害解析用に多くのコンポーネントがETWでトレースを残しているようだが、このセッションの設定がよくないようで、イベントビューアに結構な数のエラーが残ってしまっている。ログの名前が、"Microsoft-Windows-Kernel-EventTracing/Admin"のイベントがそれだ。上にかいたように、セッションの動作とトレース記録動作は独立なので、セッションの動作でエラーが起きても、トレースを書いている側の動作には問題が無いことがほとんどだと思われる。が、イベントログにはエラーとして残るため、多くのWindowsユーザは、なにかまずいことがおきているのではと、心配になる。この辺は、改善して欲しいものである。

私のマシンで出ているETWのセッション関係のエラーは、以下だ。

「次のエラーのためセッション"Circular Kernel Context Logger"を開始できませんでした。0xc0000035」
まぁ、なんのこっちゃかわからないですよね。ちなみに、0xc0000035は、ファイルが見つからない、というカーネルのエラーコード。セッションを記録するために指定したファイルのパスが不正なのか、、、。うれしいことに解決策は見つかっているようで、マシンに搭載されているネットワークアダプタからIPv6のプロトコルスタックをはずせばよいそうな。わかっても、なんのこっちゃか。

「セッションReadyBootが次のエラーで停止しました: 0xc0000188」
「セッションReadyBootの最大ファイルサイズに達しました。。。。」
0xc0000188は、ログファイルがいっぱいです、という意味のカーネルエラーコード。まぁ、そうなんでしょうな、ファイルがいっぱいになってしまったんでしょうな。確かに、ETWでは、最大ファイルサイズが指定できたような。。で、うれしいことに、これに関しては、Microsoftが問題ありませんと宣言してくれています。ちなみにReadyBootは、ファイルのキャッシュ機構の一種で、Windowsのブート時のファイル先読みキャッシュ機構である。

これらは、もともとの機能とは無関係に、ETWがセッションの不調を残しているのが、ややこしい。確かに、ETWとしてはエラーなんだろうけど、もともとの機能は問題なく動作しているのだからね。もう少しよい記録の仕方があるのではないかなぁ。。

[2011/10/24追記]
通常動作に問題ないイベントをイベントビューアに表示させない方法もある。この設定をしておくと、けっこうさっぱりする。

0 件のコメント :

コメントを投稿