Psscor2/Psscor4で使用できるコマンド!ASPXpagesについて説明します。!ASPXpagesを利用すると、w3wp.exeにロードされているASPXページを表示することができます。
使用例として、テスターが「ページの読み込みに時間がかかった」という問題を発見した場合のトラブルシューティングを考えます。
今回使用するサイト
以下のようなASP.NETのページを考えます。
Buttonが押されると"ボタンは押されてません"が"ボタンが押されました"に変わる単純なサイトです。
このButtonを押す時の処理に時間がかかっているサイトを例とします。
トラブルシューティング
1. テスターが、Buttonを押すとページの読み込みに時間がかかった、という問題を発見します。
2. テスターが、ページを読み込んでいる時のw3wp.exeのダンプを取得します。
ブラウザのアイコンでページ読み込み中かはわかります。
ダンプを取得する際に、w3wp.exeが64bit OS上で動いておりかつ32bitプロセスとして動いてるときは注意してください。
(その際はこちらとこちらをご参照ください。)
今回は64bit OS上の64bitプロセスとして動いているので、通常のタスクマネージャーからダンプを作成しました。
3. 開発者にダンプを送ります。
4. 開発者はダンプをWinDbgで開きます。
x86のダンプの際はx86のWinDbgを、x64のダンプの際はx64のWinDbgを使用する必要があることに注意してください。
5. シンボルの読み込み、Psscor2/Psscor4の読み込みを行います。
今回は.NET 4.0の環境かつx64のダンプであったのでx64用のPsscor4を使用しました。
6. !ASPXPagesを実行します。
ThreadIdがXXXであるものはそのスレッドが終了したものを表しています。現在動いているのはThreaIdが25のものです。
そのスレッドは10 Sec動いていることも確認できます。
7. ~25sでカレントスレッドを25に移し、!clrstackでスタックを見てみます。
現在このスレッドはSleepInternal()になっていることがわかります。
8. SleepInternal()を呼び出し得ているButton1_Click()関数のソースDeffault.aspx.csを見てみます。
protected void Button1_Click(object sender, EventArgs e)
{
Thread.Sleep(20000);
Label1.Text = "ボタンが押されました";
}
今回は擬似的にSleep()でスローダウンを発生させましたが、同様の方法でスローダウンの原因がわかりえます。
このようにPsscor2/Psscor4の!ASPXPagesを利用すると、サイトのスローダウンの原因を調べることが可能になりえます。