kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

単体で使えるIntelliTrace Collector(2)-SharePoint開発

これはALM Advent Calendar 23日目の記事です。前回、SharePointのシミュレーターを使用した単体テストについて書きました。
SharePointエミュレーターを使用して単体テストを行う - 新日々此何有哉
あれは前ふりで、こちらが本命です。前回の記事の環境を引き続き使用します。Visual Studio 2012 Update1ではSharePointのIntelliTraceがサポートされました。トラブル発生時、IntelliTrace CollectorでIntelliTraceで解析してみましょう。IntelliTrace Collectorの設定はこちらを見てください。
単体で使えるIntelliTrace Collector(1) - 新日々此何有哉
SharePointのプロジェクトを作ります。今回はSharePoint 2010-視覚的Webパーツを選択します。この環境にはOffice 2013開発環境(まだベータ版です)も入れているため、Office 2013がプロジェクトの選択肢として表示されていますが、通常はOffice 2010のみのはずです。

テンプレートを選択すると、SharePointカスタマイズウィザードが表示されます。

サンドボックスソリューションで構いません。OKボタンを押してください。
プロジェクトがこのような感じで作られます。

で、ちょっと手抜きで(SharePointのソリューションの話が本質ではないので(^^;)、codezineの広瀬さんの記事がちょうどいいくらいのサンプルなので、これを使わせていただきましょう。Visual Studio 2010ですが、コマンドは全部同じです。
SharePoint 2010のWebパーツを作成 (2/3):CodeZine
プロジェクトを右クリックして、発行か配置を選択します。

発行はプロジェクトを作ったときに指定した「デバッグ用のSharePointサイト」へ直接追加します。配置は一度ファイルシステムに生成するか、SharePointを選択します(ただし、サンドボックスソリューションの場合のみ)。

ファイルシステムに生成したら、生成されたwspファイルをSharePointに登録します。ページから編集をクリックすると編集モードになります。

Webパーツを追加します。どこでもいいので、トップページの中にでも追加しましょう。





こんな風に追加できたはずです。ここからが本題です。まずは、codezineの記事内のAddButton_Clickコールバックを以下のように書き換えます。

        protected void AddButton_Click(object sender, EventArgs e)
        {
            // データコンテキストの取得
            var dc = new SampleDCDataContext(SPOM.SPContext.Current.Web.Url);

            // (5)新規オブジェクトの作成
            var o = new お知らせ();
            o.タイトル = TitleTextBox.Text;
            o.本文 = BodyTextBox.Text;
            o.有効期限 = DateTime.Now.AddDays(10); //有効期限を追加した
            dc.お知らせ.Attach(o); //わざとAttachメソッドに変更

            // (6)オブジェクトの追加
            //dc.お知らせ.InsertOnSubmit(o); //正しいInsertOnSubmitを削除
            dc.SubmitChanges();

            Refresh();
        }

要は使い方を間違えた、という想定です。実際はこの程度はデバッガでいいのですが、IntelliTrace Collectorで本番環境でしか起きない、という現象調査の練習のためなので、目をつぶってください(^^;。
上記のように書き換えたWebパーツを再度配置して、タイトルと本文に何か書いて、「追加」ボタンを押してください。

こんな風にエラーになるはずです。

ではまずデバッグ実行してみましょう。F5キーでデバッグ実行すると、例外が発生したところが出てきます。Visual StudioのIntelliTraceにも履歴が出ています。履歴をさかのぼると、途中でこんなシンボルが読み込まれていません、というエラーが出ます。

シンボルサーバーを適切に設定していれば読み込みますが、そうではないモジュール類はどこから読むか?という問い合わせです。必要であれば、シンボルを読み込んでもいいですが、通常はなくてもかまいません。
このデバッグは、もたもたやっていたらASP.NET(IIS)のping死活監視の時間が来てしまい、IntelliTraceが途中で終わります。開発環境であれば、ASP.NETの死活監視を伸ばすという手もありますが、こういうときにはIntelliTrace Collectorを使ってみましょう。設定方法は単体で使えるIntelliTrace Collector(1) - 新日々此何有哉を読んでください。
IntelliTrace Collectorで採取を始めます。アプリケーションプールは"SharePoint - 80"という名前です。D;\Collecotorフォルダに採取するとします。

PS c:\temp>Start-IntelliTraceCollection "SharePoint - 80" .\collection_plan.ASP.NET.default.xml D:\Collector

適宜、スナップショットを取ります。今回の場合は操作が分かっているので、発生直後に採取すればいいでしょう。

PS c:\temp>Checkpoint-IntelliTraceCollection "SharePoint - 80"

終了後、d:\Collectorフォルダを開いてください。こんなファイルができています。

CheckPoint-IntelliTraceCollectionを実行するたびに記録されます。終了するにはStop-IntelliTraceCollectionを使用します。

PS c:\temp>Stop-IntelliTraceCollection "SharePoint - 80"

発生直後のitraceファイルをVisual Studioで開いてみましょう。itraceファイルを開くと、このような状態になります。相関IDは後で出てきます。

例外データを開いて、任意の例外が発生した行をクリックすると、記録された例外が表示されます。

要求単位でみることもできます。

デバッガと同じようにシンボルが読みこまれていないところでジャンプインしようとすると、このようにシンボルが読みこまれていませんという状態になります。

これは!と思う行を選択して「デバッグ開始」ボタンを押すか、ダブルクリックすれば該当行のデバッグが行えます。
最初に出てくる相関IDは、この画面に右上出ている値ですね。Web要求をクリックすると、表示されているGUIDの値です。

ちょっと作業ミスしたようで、例外が発生したところのキャプチャが取れていませんでしたが(^^;。また後でやり直してみます。IntelliTrace Collectorでデプロイした環境でしか起きない、という問題もこれでデバッグしやすくなるのではないでしょうか。
特にSharePointの開発ってメモリ24GBとか32GBとか普通に要求しますしね。