チュートリアル: IntelliTrace を使用した SharePoint アプリケーションのデバッグ
IntelliTrace を使用することで、アプリケーションなどのデバッグを簡単に実行できます。デバッグできるアプリケーションには、SharePoint ソリューションのように Web ページを組み込むアプリケーションも含まれます。従来のデバッガーでは、現時点のアプリケーションの状態を示すスナップショットだけを取得できました。IntelliTrace を使用すると、アプリケーション内で過去に発生したイベントと、そのイベントが発生したコンテキストをレビューし、その発生場所に移動できます。
このチュートリアルでは、Visual Studio で IntelliTrace を使用して SharePoint プロジェクトをデバッグする方法について説明します。このプロジェクトには、フィーチャーがアクティブ化されたときに、タスク リストにタスクを、お知らせリストにお知らせを追加するフィーチャー レシーバーが組み込まれます。フィーチャーが非アクティブ化されると、タスクは完了とマークされ、次のお知らせがお知らせリストに追加されます。ただし、このプロシージャには、プロジェクトの正常な実行を妨げる論理エラーが含まれています。IntelliTrace を使用することで、このエラーを見つけて修正できます。
このチュートリアルでは、次の作業について説明します。
フィーチャーとフィーチャー イベント レシーバーの作成
コードを使用したフィーチャー イベントへの応答
コードを使用したタスク リストおよびお知らせリストの参照
コードを使用したリスト要素の検出および操作
IntelliTrace を使用したコード エラーの検出と修正
-
[!メモ]
このトピックで説明する手順で参照しているユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。これらの要素は、設定と Visual Studio のエディションによって異なります。詳細については、「Visual Studio の設定」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
サポート対象エディションの Windows と SharePoint詳細については、「SharePoint ソリューションの開発要件」を参照してください。
Visual Studio 2012.
フィーチャー レシーバーの作成
最初に、フィーチャー レシーバーがある空の SharePoint プロジェクトを作成します。
フィーチャー レシーバーを作成するには
Visual Studio を、[管理者として実行] オプションを使用して起動します。
メニュー バーで [ファイル]、[新規]、[プロジェクト] の順にクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
ダイアログ ボックスの上部に、.NET Frameworkのバージョンの [.NET Framework 3.5] リストのを選択します。
使用する言語のノードで、[SharePoint] のノードを展開し、[2010] のノードを選択します。
[テンプレート] のペインで、[SharePoint 2010 プロジェクト] テンプレートを選択し、IntelliTraceTestにプロジェクトの名前を変更し、[OK] のボタンをクリックします。
SharePoint カスタマイズ ウィザードが表示されます。このウィザードで、プロジェクト用の SharePoint サイトとソリューションの信頼レベルの両方を指定できます。
[ファーム ソリューションとして配置する] のオプション ボタンを選択し、[完了] のボタンをクリックします。
IntelliTrace は、ファーム ソリューションに対してのみ動作します。
[ソリューション エクスプローラー]では、[機能] のノードのショートカット メニューを開き、**[フィーチャーの追加]**を選択します。
Feature1.feature が表示されます。
Feature1.featureからショートカット メニューを開き、をクリックして、コード モジュールにフィーチャーを追加するに [イベント レシーバーの追加] を選択します。
フィーチャー レシーバーへのコードの追加
次に、フィーチャー レシーバー内の 2 つのメソッド (FeatureActivated と FeatureDeactivating) にコードを追加します。これらのメソッドは、SharePoint でフィーチャーがアクティブ化または非アクティブ化されたときにトリガーされます。
フィーチャー レシーバーにコードを追加するには
Feature1EventReceiver クラスの一番上に、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の起動時に、[クイック起動] のウィンドウで、[リスト] のリンクを選択し、その後に両方のお知らせリストの内容を表示するには、一覧、およびDeactivate feature選択します。
お知らせリストには "Activated feature: IntelliTraceTest_Feature1" という名前の新しいお知らせが追加され、タスク リストには "Deactivate feature: IntelliTraceTest_Feature1" という名前の新しいタスクが追加されています。タスクのステータスは、[未開始] です。
[サイト アクション] のメニューを開き、[サイトの設定]を選択し、[サイト アクション]の下に [サイト機能の管理] のリンクを選択してフィーチャーを非アクティブ化します。[非アクティブ化] のボタンを **[IntelliTraceTest Feature1]**の横にあるを選択し、警告ページの [この機能を非アクティブ化] のリンクを選択します。
[クイック起動] のペインで、[タスク] のリンクを選択します。
タスクの [ステータス] 値が [完了] に、[完了 %] 値が [100%] になると考えられますが、値は既定の設定のままです。タスクは、コード内のエラーによって更新が妨げられています。
プロジェクトのデバッグ
IntelliTrace を使用して、コード内の問題を検出して修正します。
プロジェクトをデバッグするには
Visual Studioでは、FeatureDeactivating のメソッドでは、Visual C#の SPQuery qry = new SPQuery(); の行またはVisual Basicの Dim qry As New SPQuery() の行を探します。その行にブレークポイントを挿入するF9キーを選択します。
フィーチャーが非アクティブ化されたときに問題が発生しているので、この行はデバッグを開始するための論理場所になります。
プログラムを再度実行するには、F5キーを選択し、手順を「のこのトピックの」プロジェクトをテストするために繰り返してフィーチャーをアクティブ化した後、非アクティブ化されます。
FeatureDeactivating 内のブレークポイントに達すると、IntelliTrace ウィンドウが表示され、アプリケーションが今までに実行したステップがすべて表示されます。
[IntelliTrace] のペインで、[ライブ イベント] のカテゴリで、[ローカル] のリンクを選択します。
次のコード行をステップ オーバーするF11キーを選択します。
これは、F11キーを選択するたびに、別の「Debugger: 」行が履歴をデバッグするには、アプリケーションのIntelliTraceに追加されます。
次のコード行をステップ オーバーするF11キーを選択します。
[ローカル] のペインで、[qry] の名前を展開し、[クエリ] の値が赤で表示されることに注意してください。
この違いは、タスクを検索するためのクエリで「Deactivate "ではなく「Deactive」が不正に」検索を示します。このエラーは、タスクをタスク リスト内のクエリにはないことを意味します。
次のコード行をステップ オーバーするF11キーを選択します。
[ローカル] のペインで、[taskItems] の名前を展開し、[カウント] の値がゼロであることに注意してください (0)。
この値は taskItems のコレクションが qry の項目を含まないことを示します。
デバッグを継続するにF5キーを選択します。
プログラムが完了したら、Intellitraceウィンドウの [すべて中断] のリンクを選択します。
IntelliTrace データを保存するには、このステップを実行する必要があります。
次に、アプリケーションの呼び出し情報をで、Intellitraceツール バーの表示、[IntelliTrace の設定を開く] のリンクを、[IntelliTrace events and call information] のオプション ボタンを選択した [オプション] のダイアログ ボックスで選択します。
IntelliTraceツール バーで、デバッグ データを保存するに [現在の IntelliTrace セッションを保存する] のボタンをクリックします。
ファイルの拡張子は .iTrace になります。
Visual Studio のメニュー バーで、[デバッグ]、**[デバッグの停止]**を選択します。
.iTrace ファイルを開きます。
この手順では、スレッドで例外のデータやプログラムで使用されているリストなどのデバッグ情報を提供するIntelliTraceの概要ページを開きます。
**[スレッド一覧]を展開し、[メイン スレッド]**を選択し、を [デバッグの開始] のボタンをクリックします。
この手順により、Visual Studio で .iTrace データを使用するデバッグ セッションが開始されます。Intellitraceウィンドウのイベントの詳細を表示するには、イベントを選択します。
SPListItemCollection taskItems = taskList.GetItems(qry);の [Debugger:] の手順の [ローカル] のリンクを選択します。
[ローカル] ウィンドウが表示されます。
[ローカル] ウィンドウで、変数リストを展開し、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%]) が設定されたことを確認します。
参照
概念
IntelliTrace での履歴のレビューによるコードのデバッグの高速化