Win7: Fault Tolerant Heap(その2)

以前、Windows 7 の機能で Fault Tolerant Heap を紹介しました。
追加情報がありますので、まとめておきます。

FTH の起動条件

  • 対話型プログラムであること
    …とありますが、実際には、コンソールやサービスプログラムでも FTH が動く場合があるみたいです。
  • FTH は Diagnotic Policy Service サービスが実装しているので、この実行アカウント(Local Service)の権限範囲内で実行できること
    例えばですが、ユーザープロファイルフォルダに対して、Local Service アカウントは読み取り権限を持っていません。
    そのため、ユーザープロファイルフォルダ上にあるプログラムに対して FTH は働きません。

FTH が動作したときのイベントログを載せときます。
この例は、wmphost.exe というクラッシュするプログラムに FTH が働いた場合です。

Win7: Fault Tolerant Heap

この機能はなんぞやと…。
なかなか、衝撃的な機能です。一言でまとめると

  • アプリケーションのヒープクラッシュを監視して、次回起動時にクラッシュを自動的に回避する

です。ちなみに、Windows 7 限定の機能です。
アプリケーションがヒープ関係の例外を発生した際に、OS 側で検知して、その部分を何とかして回避するように
メモリ配置を変えて、動かすという何とも言えない機能です。
そのため、初回起動時にアプリケーションがヒープクラッシュしても、二度目、三度目…に起動すると
何事も無かったかのように動いてしまいます。
ユーザー目線では、良い機能だと思いますが、開発者目線だと、悩ましいですね。

なお、FTH ですが、Microsoft Research も絡んでいるようですね。

FTH はイベントビューアで動作を確認することができます。

アプリケーションとサービス ログ
  Microsoft
    Windows
      Fault-Tolerant-Heap

ここにイベントが出力されます。
FTH は無効にすることもできますので、アプリケーション開発時には、バグチェックを行う都合上、
無効にしておいた方がよいでしょう。以下のレジストリエントリーで FTH を無効にすることができます。

HKLM\Software\Microsoft\FLH@Enabled = 0

次に FTH の餌食になってしまった場合のリセット方法です。
コマンドプロンプト(管理者権限で)を開き

Rundll32.exe fthsvc.dll,FthSysprepSpecialize

を実行します。ただし、このコマンドでは、すべてのアプリケーションをリセットしますので、
どうしても個別にリセットしたいのであればレジストリを開いて、各アプリ毎のエントリーを
削除するしか方法はありません。

FTH はセミナーの際、実際のデモで動作をお見せしたいと思います。
ぶっちゃけ、見た方が早いですね。。。