チュートリアル: IntelliTrace を使用して SharePoint アプリケーションをデバッグする
IntelliTrace を使用することで、アプリケーションなどのデバッグを簡単に実行できます。デバッグできるアプリケーションには、SharePoint ソリューションのように Web ページを組み込むアプリケーションも含まれます。 従来のデバッガーでは、現時点のアプリケーションの状態を示すスナップショットだけを取得できました。 IntelliTrace を使用すると、アプリケーション内で過去に発生したイベントと、そのイベントが発生したコンテキストをレビューし、その発生場所に移動できます。
このチュートリアルでは、Visual Studio 2010 で IntelliTrace を使用して SharePoint プロジェクトをデバッグする方法について説明します。 このプロジェクトには、フィーチャーがアクティブ化されたときに、タスク リストにタスクを、お知らせリストにお知らせを追加するフィーチャー レシーバーが組み込まれます。 フィーチャーが非アクティブ化されると、タスクは完了とマークされ、次のお知らせがお知らせリストに追加されます。 ただし、このプロシージャには、プロジェクトの正常な実行を妨げる論理エラーが含まれています。 IntelliTrace を使用することで、このエラーを見つけて修正できます。
このチュートリアルでは、次の作業について説明します。
フィーチャーとフィーチャー イベント レシーバーの作成
コードを使用したフィーチャー イベントへの応答
コードを使用したタスク リストおよびお知らせリストの参照
コードを使用したリスト要素の検出および操作
IntelliTrace を使用したコード エラーの検出と修正
-
注意
このトピックで説明する手順で参照しているユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、設定と Visual Studio のエディションによって異なります。 詳細については、「設定の操作」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
サポート対象エディションの Windows と SharePoint 詳細については、「SharePoint ソリューションの開発要件」を参照してください。
Visual Studio 2010 Professional SP1、Visual Studio 2010 Premium SP1、または Visual Studio 2010 Ultimate SP1
フィーチャー レシーバーの作成
最初に、フィーチャー レシーバーがある空の SharePoint プロジェクトを作成します。
フィーチャー レシーバーを作成するには
Visual Studio を、[管理者として実行] オプションを使用して起動します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
ダイアログ ボックスの上部で、リストの [.NET Framework 3.5] をクリックします (まだ選択されていない場合)。
使用する言語の [SharePoint] ノードを展開し、[2010] ノードをクリックします。
[テンプレート] ペインで [空の SharePoint プロジェクト] をクリックし、プロジェクトの名前を「IntelliTraceTest」に変更して、[OK] をクリックします。
SharePoint カスタマイズ ウィザードが表示されます。このウィザードで、プロジェクト用の SharePoint サイトとソリューションの信頼レベルの両方を指定できます。
[ファーム ソリューションとして配置する] をクリックし、[完了] をクリックします。
IntelliTrace は、ファーム ソリューションに対してのみ動作します。
ソリューション エクスプローラーで、[フィーチャー] ノードを右クリックし、[フィーチャーの追加] をクリックします。
Feature1.feature が表示されます。
Feature1.feature を右クリックし、[イベント レシーバーの追加] をクリックして、コード モジュールにフィーチャーを追加します。
フィーチャー レシーバーへのコードの追加
次に、フィーチャー レシーバー内の 2 つのメソッド (FeatureActivated と FeatureDeactivating) にコードを追加します。 これらのメソッドは、SharePoint でフィーチャーがアクティブ化または非アクティブ化されたときにトリガーされます。
フィーチャー レシーバーにコードを追加するには
Feature1.EventReceiver クラスの一番上に、SharePoint サイトとサブサイトを指定する変数を宣言する次のコードを追加します。
' SharePoint site/subsite. Private siteUrl As String = "https://localhost" Private webUrl As String = "/"
// SharePoint site/subsite. private string siteUrl = "https://localhost"; private string webUrl = "/";
FeatureActivated メソッドを次のコードで置き換えます。
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties) Try Using site As New SPSite(siteUrl) Using web As SPWeb = site.OpenWeb(webUrl) ' Reference the lists. Dim announcementsList As SPList = web.Lists("Announcements") Dim taskList As SPList = web.Lists("Tasks") ' Add a new announcement to the Announcements list. Dim listItem As SPListItem = announcementsList.Items.Add() listItem("Title") = "Activated Feature: " & Convert.ToString(properties.Definition.DisplayName) listItem("Body") = Convert.ToString(properties.Definition.DisplayName) & " was activated on: " & DateTime.Now.ToString() listItem.Update() ' Add a to-do task to the Task list. Dim newTask As SPListItem = taskList.Items.Add() newTask("Title") = "Deactivate feature: " & Convert.ToString(properties.Definition.DisplayName) newTask.Update() End Using End Using Catch e As Exception Console.WriteLine("Error: " & e.ToString()) End Try End Sub
public override void FeatureActivated(SPFeatureReceiverProperties properties) { try { using (SPSite site = new SPSite(siteUrl)) { using (SPWeb web = site.OpenWeb(webUrl)) { // Reference the lists. SPList announcementsList = web.Lists["Announcements"]; SPList taskList = web.Lists["Tasks"]; // Add a new announcement to the Announcements list. SPListItem listItem = announcementsList.Items.Add(); listItem["Title"] = "Activated Feature: " + properties.Definition.DisplayName; listItem["Body"] = properties.Definition.DisplayName + " was activated on: " + DateTime.Now.ToString(); listItem.Update(); // Add a to-do task to the Task list. SPListItem newTask = taskList.Items.Add(); newTask["Title"] = "Deactivate feature: " + properties.Definition.DisplayName; newTask.Update(); } } } catch (Exception e) { Console.WriteLine("Error: " + e.ToString()); } }
FeatureDeactivating メソッドを次のコードで置き換えます。
Public Overrides Sub FeatureDeactivating(ByVal properties As SPFeatureReceiverProperties) Try Using site As New SPSite(siteUrl) Using web As SPWeb = site.OpenWeb(webUrl) ' Reference the lists Dim taskList As SPList = web.Lists("Tasks") Dim announcementsList As SPList = web.Lists("Announcements") ' Add an announcement that the feature was deactivated. Dim listItem As SPListItem = announcementsList.Items.Add() listItem("Title") = "Deactivated Feature: " & Convert.ToString(properties.Definition.DisplayName) listItem("Body") = Convert.ToString(properties.Definition.DisplayName) & " was deactivated on: " & DateTime.Now.ToString() listItem.Update() ' Find the task the feature receiver added to the Task list when the ' feature was activated. Dim qry As New SPQuery() qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>" Dim taskItems As SPListItemCollection = taskList.GetItems(qry) For Each taskItem As SPListItem In taskItems ' Mark the task as complete. taskItem("PercentComplete") = 1 taskItem("Status") = "Completed" taskItem.Update() Next End Using End Using Catch e As Exception Console.WriteLine("Error: " & e.ToString()) End Try End Sub
public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { try { using (SPSite site = new SPSite(siteUrl)) { using (SPWeb web = site.OpenWeb(webUrl)) { // Reference the lists SPList taskList = web.Lists["Tasks"]; SPList announcementsList = web.Lists["Announcements"]; // Add an announcement that the feature was deactivated. SPListItem listItem = announcementsList.Items.Add(); listItem["Title"] = "Deactivated Feature: " + properties.Definition.DisplayName; listItem["Body"] = properties.Definition.DisplayName + " was deactivated on: " + DateTime.Now.ToString(); listItem.Update(); // Find the task the feature receiver added to the Task list when the // feature was activated. SPQuery qry = new SPQuery(); qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>"; SPListItemCollection taskItems = taskList.GetItems(qry); foreach (SPListItem taskItem in taskItems) { // Mark the task as complete. taskItem["PercentComplete"] = 1; taskItem["Status"] = "Completed"; taskItem.Update(); } } } } catch (Exception e) { Console.WriteLine("Error: " + e.ToString()); } }
プロジェクトのテスト
コードがフィーチャー レシーバーに追加されたので、SharePoint アプリケーションを実行して、それが正常に動作するかどうかをテストします。 この例では、コードに小さなエラーが含まれています。 エラーが発生した後、IntelliTrace を使用して問題を追跡します。
プロジェクトをテストするには
F5 キーを押してプロジェクトを実行します。
フィーチャーは配置時に自動的にアクティブ化され、フィーチャー レシーバーによってお知らせとタスクが自動的に追加されます。
SharePoint の起動後、ナビゲーション ペインの [リスト] をクリックし、[お知らせリスト] と [タスク リスト] の両方をクリックして、リストの内容を表示します。
お知らせリストには "Activated feature: IntelliTraceTest_Feature1" という名前の新しいお知らせが追加され、タスク リストには "Deactivate feature: IntelliTraceTest_Feature1" という名前の新しいタスクが追加されています。 タスクのステータスは、[未開始] です。
[サイトの操作] の下の [サイトのフィーチャーの管理] をクリックし、[IntelliTraceTest Feature1] の横の [非アクティブ化] をクリックし、警告ページの [この機能を非アクティブ化] リンクをクリックしてフィーチャーを非アクティブ化します。
タスクの [ステータス] 値が [完了] に、[完了 %] 値が [100%] になると考えられますが、値は既定の設定のままです。 タスクは、コード内のエラーによって更新が妨げられています。
プロジェクトのデバッグ
IntelliTrace を使用して、コード内の問題を検出して修正します。
プロジェクトをデバッグするには
FeatureDeactivating メソッドで SPQuery qry = new SPQuery(); 行を探し、F9 キーを押してその行にブレークポイントを挿入します。
フィーチャーが非アクティブ化されたときに問題が発生しているので、この行はデバッグを開始するための論理場所になります。
F5 キーを押してプログラムを再度実行し、このトピックの「プロジェクトをテストするには」の手順を繰り返してフィーチャーをアクティブ化した後、非アクティブ化します。
FeatureActivated 内のブレークポイントに達すると、IntelliTrace ウィンドウが表示され、アプリケーションが今までに実行したステップがすべて表示されます。
F11 キーを押して、プログラムが完了するまで、コードを行単位で実行します。
F11 キーを押すたびに、アプリケーションの IntelliTrace デバッグ履歴に "Debugger:" 行が追加されます。
プログラムが完了したら、IntelliTrace ウィンドウの [すべて中断] リンクをクリックします。
IntelliTrace データを保存するには、このステップを実行する必要があります。
オプションとして、アプリケーションの呼び出し情報を表示するには、IntelliTrace ツール バーの [IntelliTrace の設定を開く] をクリックし、[IntelliTrace イベントと呼び出し情報] をクリックします。
IntelliTrace ツール バーの [現在の IntelliTrace セッションを保存する] をクリックして、デバッグ データを保存します。
ファイルの拡張子は .iTrace になります。
Visual Studio で、[デバッグの停止] をクリックします。
.iTrace ファイルを開きます。
このステップにより、IntelliTrace の概要ページを表示する Visual Studio の別のインスタンスが開き、例外データやプログラムで使用されたスレッドの一覧などのデバッグ情報が表示されます。
[スレッド一覧] を展開し、[メイン スレッド] をクリックし、[デバッグ開始] をクリックします。
この手順により、Visual Studio で .iTrace データを使用するデバッグ セッションが開始されます。 イベントの詳細を IntelliTrace ウィンドウに表示するには、詳細を表示するイベントをクリックします。
エラーは FeatureDeactivating メソッドで発生した疑いがあるので、Debugger: ステップ SPListItemCollection taskItems = taskList.GetItems(qry); の [ローカル] リンクをクリックします。
[ローカル] ウィンドウが表示されます。
[ローカル] ウィンドウで、変数リストを展開し、qry.Query を見つけ、タスクを検出するためのクエリで、"Deactivate" ではなく "Deactive" が間違って検索されていることを確認します。
このエラーは、タスク リストのクエリでタスクが検出されないことを意味します。
プロジェクトの再テスト
IntelliTrace を使用して問題が特定されたので、エラーを修正して、プロジェクトを再テストします。
プロジェクトを再テストするには
Visual Studio のデバッグ セッションを閉じ、IntelliTraceTest プロジェクトを再度開きます (まだ開いていない場合)。
コードのクエリ文字列 (qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>") で、値を Deactive から Deactivate に変更します。
F5 キーを押してプロジェクトを再び実行します。
タスク リストを開き、非アクティブ化タスクの [ステータス] と [完了 %] に、それぞれ正しい値 ([完了] と [100%]) が設定されたことを確認します。