ASP.NET デッドロック 検知機能について (3)

こんにちは d99 です。
またもや間が空いてしまいましたが、このネタの続きを。これを完結させませんと先には進めませんので。

前回 「デッドロックが検出されました」 というイベントログをわざと発生させる設定とサンプルプログラムをご紹介しました。

ASP.NET デッドロック 検知機能について (2)
https://blogs.msdn.com/b/d99/archive/2012/02/29/10274250.aspx

今回は、このプログラムを使ってデッドロック検知時にダンプファイルを自動採取してみます。

前回の通り、サーバー環境は、Windows Server 2003、IIS 6.0 + .NET Framework 2.0 を使用します。前回のサンプルを https://localhost/DeadlockTest/test.aspx に配置したとします。前回記載の手順でデッドロック検知のイベントをわざと起こせる事も確認済みです。では、まずダンプファイル採取の設定を行いましょう。

※ 下記手順は、Windows Server 2008 以降では使用できません。これは、IIS と ASP.NET 統合の影響によって、ASP.NET がそもそもデッドロック検出イベントを発生させなくなったためです。2008 以降でどうすれば良いかについては、後日ご紹介する予定です。

ダンプファイル採取の設定手順はサポート技術情報でご用意しています。

IIS 6.0 で ASP.NET がデッドロックになった場合のダンプ ファイルの生成方法
https://support.microsoft.com/kb/828222/ja

Debugging Tools for Windows をインストール(別の環境にインストールし、フォルダごとコピーでも構いません)、バッチファイルやダンプ出力フォルダを用意して、IIS の設定をコマンドラインから変更するだけです。Debugging Tools for Windows は以下から過去のバージョンのものを(バージョン 6.11)をご利用ください。

32 ビット版 Debugging Tools for Windows
https://msdn.microsoft.com/ja-jp/windows/hardware/gg463016

ASP.NET 運用デバッグ入門 1) デバッガのインストール
https://blogs.msdn.com/b/d99/archive/2008/04/01/8347420.aspx

※ 最新版の Debugging Tools for WIndows でもコマンド自体には変更はありません。ただし、最新版は単体ダウンロードでのご用意がなく SDK や DDK に含まれているため、開発機等へ一旦インストールしてからコピーしていて頂くシナリオが多いのかなと思います。

なお、サポート技術情報記載の action.cmd はこのままでも良いですが、少しいじっておくと便利な場合があります。

@if "%_echo%"=="" echo off
setlocal
    set TIMESTAMP=%DATE:~-9%_%TIME%
set TIMESTAMP=%TIMESTAMP:/=_%
set TIMESTAMP=%TIMESTAMP::=_%
set TIMESTAMP=%TIMESTAMP:.=_%
set TIMESTAMP=%TIMESTAMP: =_%
set FILENAME=c:\dump\crash_%TIMESTAMP%.dmp
set LOG=c:\dump\log_%TIMESTAMP%.txt
set COMMAND="C:\Program Files\Debugging Tools for Windows (x86)\cdb.exe" -c ".dump /o /ma %FILENAME%;q" -p %1

echo %COMMAND% > %LOG%
%COMMAND% >> %LOG% 2>&1

endlocal

グレーの部分はパスを変更しただけです。黄色の部分ですが、まず cdb.exe のオプションを /mhf から /ma に変えています。これは /ma の方が多少多くの情報が取れるためです。また、再度の %COMMAND% にオプションを追加しているのは、バッチファイルに間違いなどが合った場合もエラーが log.txt に記録できるようにしているだけです。

サポート技術情報の設定をほどこした上で、前回の再現手順を行います。パフォーマンスモニタで観測すると以下のようになります(下記環境は 2CPU で、同時実行数の上限が5になるように machine.config を調整しています)。

perfmon

IIS はオーバーラップリサイクル(次のプロセスを起動してから、古いプロセスを終了させる)を行うので、デッドロック検知が働いて、新しい w3wp.exe が起動すると見た目上同時実行数が増えたように見えますが、このタイミングでデッドロック検知のイベントログが記録されているかと思います。そして、指定したフォルダに .dmp ファイルと、.txt が出力されます。

さて、次回はこのダンプファイルを素材に、ASP.NET の中身がどのように見えるか、確認してみましょう。

ではまた。
d99 でした。