ADPlus (AD+)

ADPlus (AD+) はマイクロソフトのサポート部門にて開発されたトラブルシューティング用ツールです。 AD+ を調査対象のプロセスに仕掛けると、アクセス違反 (AV) やスタックオーバーフロー (SOV) などの致命的なエラーが発生したところで、クラッシュダンプを生成することが容易になります。とくに、Internet Information Services (IIS) の調査では威力を発揮します。IIS は複数のプロセスで構成されているため、トラブルシューティングを行うときに複数のプロセスにデバッガをアタッチする必要あります。これはシステム管理者のトラブルシューティング作業を難しくしている一つの理由でもあります。AD+ には IIS 用のオプションが用意されており、IIS 関連プロセスすべてを適切にモニターすることができトラブルシューティングが容易になります。

AD+ は本質的に 「デバッガに適切なパラメータを渡すための VBScript」 といえます。Debugging Tools for Windows さえインストールされていれば、 利用可能になりますから、Debug Diagnostics Tool がインストールできない環境などではとても貴重なツールであるといえると思います。

クラッシュモード –crash

AV と SOV のセカンドチャンス例外が発生したときにクラッシュダンプを出力するモードです。

次のコマンドを実行すると、IIS の関連プロセスにデバッガ (cdb) がアタッチします。

> cscript -crash -iis

そして、デバッガをアタッチしたまま実行を続け、問題が発生したところでユーザーダンプ等、ポストモーテムデバッグに必要な情報を出力します。

しかし実はここで問題があります。「IIS 関連プロセス」と一口に言ってもいろいろあるのです。

IIS 5 の場合は inetinfo.exe 及び dllhost.exe (dllhst3g.exe, 3GBモードの場合)、 IIS6/7 の場合は inetinfo.exe, w3wp.exe 及び svchost.exe が IIS の実行に関わりますが、 このうち、IIS 5 は inetinfo.exe と dllhost.exe 両方、 IIS 6/7 では w3wp.exe にてユーザーのプログラムが実行されます。 また、dllhost.exe と w3wp.exe は HTTP リクエストがあって初めて起動されます

このため、AD+ は確かに -iis という IIS に配慮したコマンドラインオプションを持つものの、 AD+ を適切なプロセスにアタッチするためには、あらかじめ IIS プロセスを起動しておく必要があるのです。

そのため、以下の手順で AD+ を利用する必要があります。

  1. IIS を起動
  2. ブラウザから IIS に HTTP リクエストを送る
  3. IIS5 では dllhost, IIS6/7 では w3wp.exe がそれぞれ起動していることを確認する (問題が発生していると疑われるアプリケーションをホストするプロセスであることが重要です)
  4. AD+ を実行し cdb をアタッチ
  5. 問題を再現させる
  6. cdb がダンプを出力する

このように、コマンド実行時に調査するプロセスがわかっている場合には、AD+ はとても便利です。 しかし、「適切なプロセスが起動していることを確認しなければならない」ということに注意を払わなくてなりません。 そこでマイクロソフトは Debug Diagnostic Tool という新しいツールを作りました。 このツールではプロセスがあらかじめ起動しているかどうかということは心配する必要がありません。 IIS の動きをモニターして、適切なプロセスの情報採取をしてくれるからです。

ハングモード –hang

ハングモードでは AD+ を仕掛けた時点でクラッシュダンプを出力します。これはデッドロックした場合あるいは CPU の使用率が 100% 近い状態が続く、いわゆるハングアップが発生した場合に有効なオプションです。

ハングモードでは、次のコマンドを実行すると直ちにユーザダンプを出力します。

> cscript adplus.vbs -hang -iis

ハングモードの場合は、その現象が発生しているときにコマンドを実行します。 ですから、クラッシュモードのようにプロセスが起動しているかどうか、という点は気にしなくて大丈夫です。

ちなみに、ハングアップに関してもDebug Diagnostic Toolで情報が採取可能です。

オプション

ファーストチャンス例外でフルダンプ

AD+ のデフォルトではファーストチャンス例外ではそれをテキストログに記録し、 さらにミニダンプを出力するにとどめます。ファーストチャンス例外はトラップ可能なものであるため、 プログラム中で正しくトラップしている限りにおいて問題になることは無いからです。 ファーストチャンス例外が処理されない場合 Windows はもう一度デバッガに処理をするチャンスを与えます。 これがセカンドチャンス例外です。AD+ はセカンドチャンス例外のときにのみフル-クラッシュダンプを出力するよう設定されています。

adplus.vbs の Create_Full_Dump_on_1st_Chance_Exception 定数を TRUE に設定して AD+ を起動するとファーストチャンス例外でフル-クラッシュダンプを生成します。 これはフェイルファスト (FailFast。セカンドチャンス例外を受けたとき、プロセスを意図的に終了させる機能) が実装されている環境で必要な機能といえます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説