共用方式為


逐步解說:使用 IntelliTrace 偵錯 SharePoint 應用程式

您可以藉由使用 IntelliTrace 更輕鬆地偵錯應用程式,包括併入網頁的應用程式 (例如 SharePoint 方案)。傳統的偵錯工具只會顯示應用程式在目前時間的狀態快照。但是,您可以使用 IntelliTrace 來檢閱,甚至巡覽到應用程式內發生的過去事件以及事件發生所在的內容。

本逐步解說示範如何使用 IntelliTrace,在 Visual Studio 中偵錯 SharePoint 專案。此專案會併入功能接收器,當啟用此功能時,它會將工作加入至工作清單,並將公告加入至公告清單。當停用此功能時,此工作會標示為已完成,並將第二個公告加入至公告清單。但是,此程序包含一個邏輯錯誤,該錯誤使得專案無法正確執行。您可以藉由使用 IntelliTrace 來尋找及更正此錯誤。

這個逐步解說將說明下列工作:

  • 建立功能和功能事件接收器。

  • 使用程式碼回應功能事件。

  • 使用程式碼參考工作和公告清單。

  • 使用程式碼尋找和操作清單項目。

  • 使用 IntelliTrace 尋找及更正程式碼錯誤。

  • 注意事項注意事項

    在使用者介面中某些項目的名稱或位置方面,您的電腦可能與本主題的指示不同。這些項目會因為您的 Visual Studio 版本的設定而不同。如需詳細資訊,請參閱Visual Studio 設定

必要條件

您需要下列元件才能完成此逐步解說:

建立功能接收器

首先,您要建立具有功能接收器的空白 SharePoint 專案。

若要建立功能接收器

  1. 使用 [以系統管理員身分執行] 選項來啟動 Visual Studio。

  2. 在功能表列上,選擇 [檔案], [新增], [Project]。

    [新增專案] 對話方塊隨即出現。

  3. 在對話方塊的頂端,選取 .NET Framework 版本的清單 [.NET Framework 3.5] 。

  4. 在您想要使用之語言下,展開 [SharePoint] 節點,然後選取 [2010] 節點。

  5. 在 [範本] 窗格中,選取 [SharePoint 2010 專案] 範本,將專案名稱變更為 IntelliTraceTest,然後選取 [確定] 按鈕。

    隨即出現 [SharePoint 自訂精靈],您可以在其中指定專案的 SharePoint 網站及方案的信任層級。

  6. 選取 [部署為陣列方案] 選項按鈕,然後選取 [完成] 按鈕。

    IntelliTrace 只會在陣列方案上操作。

  7. 在 [方案總管],開啟 [功能] 節點的捷徑功能表,然後選取 [加入功能]。

    隨即出現 Feature1.feature。

  8. 從開啟 Feature1.feature 的捷徑功能表,然後選取 [加入事件接收器] 加入程式碼模組加入至功能。

將程式碼加入至功能接收器

接下來,將程式碼加入至功能接收器中的兩個方法:FeatureActivated 和 FeatureDeactivating。每當分別在 SharePoint 中啟用或停用功能時,都會觸發這些方法。

若要將程式碼加入至功能接收器

  1. 在 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 = "/";
    
  2. 以下列程式碼取代 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());
        }
    
    }
    
  3. 以下列程式碼取代 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 來追蹤問題。

若要測試專案

  1. 選擇 F5 鍵執行專案。

    一旦部署之後,此功能就會自動啟用,使得它的功能接收器加入公告和工作。

  2. 在 SharePoint 中啟動,在 [快速啟動] 窗格中,選取 [清單] 連結,然後選取兩個公告清單和工作清單檢視其內容。

    在公告清單中,已加入名為 Activated feature: IntelliTraceTest_Feature1 的新公告,而且名為 Deactivate feature: IntelliTraceTest_Feature1 的新工作已加入至工作清單。此工作的狀態為「尚未開始」。

  3. 您可以開啟 [設置動作] 功能表,選取 [設置設定],然後選取 [管理網站功能] 連結停用功能在 [設置動作] 下。在 [IntelliTraceTest Feature1] 選擇 [停用] 按鈕,然後選取頁面的警告 [停用這個功能。] 連結。

  4. 在 [快速啟動] 窗格中,選取 [工作] 連結。

    工作的 [狀態] 值現在應該為「已完成」,而且它的 [% 完成] 值應該是 “100%”。但是,這些值依然為預設值的狀態。程式碼中的錯誤會使得工作無法更新。

對專案進行偵錯

使用 IntelliTrace 尋找及修正程式碼中的問題。

若要對專案進行偵錯

  1. 在 Visual Studio,在 FeatureDeactivating 方法,找出 SPQuery qry = new SPQuery(); 行 Visual C# 或 Dim qry As New SPQuery() 行 Visual Basic。選擇 F9 鍵插入在該行上設定中斷點。

    因為問題發生在停用此功能時,所以這一行是開始偵錯的合理位置。

  2. 選擇 F5 鍵再次執行程式,並將重複步驟在「測試專案」啟動然後停用功能之前在本主題。

    在 FeatureDeactivating 中遇到中斷點時,IntelliTrace 視窗就會出現,並列出應用程式目前為止所採取的所有步驟。

  3. 在 [IntelliTrace]窗格,在 [生命週期事件] 分類,選取 [區域] 連結。

  4. 選擇 F11 鍵跳到下一行程式碼。

    每當您選擇 F11 鍵,另一台「偵錯工具: 」行加入到應用程式的偵錯 IntelliTrace 記錄。

  5. 選擇 F11 鍵跳到下一行程式碼。

  6. 在 [區域] 窗格中,展開 [qry]名稱並注意 [查詢] 值會顯示為紅色。

    這個類別表示找出工作的查詢不正確地搜尋「停用」而非「Deactivate」。這個錯誤表示工作在工作清單中的查詢從找不到。

  7. 選擇 F11 鍵跳到下一行程式碼。

  8. 在 [區域] 窗格中,展開 [taskItems]名稱,並注意 [計數] 值為零 (0)。

    這個值表示 taskItems 集合不包含任何 qry 項目。

  9. 選擇 F5 鍵繼續偵錯。

  10. 在程式完成後,請選取 IntelliTrace 視窗的 [全部中斷] 連結。

    您必須採取此步驟,才能儲存 IntelliTrace 資料。

    您可以檢視應用程式的呼叫資訊,由在 Intellitrace 工具列,選取 [開啟 IntelliTrace 設定。] 連結,然後 [選項] ,在對話方塊中,選取 [IntelliTrace 事件和呼叫資訊] 選項按鈕。

  11. 在 IntelliTrace 工具列上,選擇 [儲存目前 IntelliTrace 工作階段] 按鈕儲存偵錯資料。

    此檔案的副檔名為 .iTrace。

  12. 在 Visual Studio 功能表列上,選擇, [偵錯][停止偵錯]。

  13. 開啟 .iTrace 檔。

    這個步驟開啟 [IntelliTrace 摘要] 頁面,提供偵錯資訊 (如例外狀況資料和執行緒清單用於程式。

  14. 展開 [執行緒清單。],選取,然後選取 [主執行緒][啟動偵錯] 按鈕。

    這個步驟會在 Visual Studio 中使用 .iTrace 資料來開始偵錯工作階段。若要檢視關於事件的其他詳細資料在 IntelliTrace 視窗中,選取事件。

  15. 選取 [偵錯工具:]步驟的 [區域] 連結 SPListItemCollection taskItems = taskList.GetItems(qry);的。

    [區域變數] 視窗隨即出現。

  16. 在 [區域變數] 視窗中,展開變數清單、尋找 qry.Query,然後確認找出此工作的查詢是否錯誤搜尋 “Deactive” 而不是 “Deactivate”。

重新測試專案

現在您已經使用 IntelliTrace 找出問題,請更正錯誤,然後重新測試專案。

若要重新測試專案

  1. 關閉 Visual Studio 的偵錯工作階段,然後重新開啟 IntelliTraceTest 專案 (如果尚未開啟)。

  2. 在程式碼的查詢字串 (qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>") 中,將值從 Deactive 變更為 Deactivate。

  3. 選擇 F5 鍵再次執行專案。

  4. 開啟工作清單,並確認 Deactivate 工作的 [狀態] 值現在正確設定為「已完成」,而且它的 [% 完成] 值為 100%。

請參閱

概念

驗證及偵錯 SharePoint 程式碼

使用 IntelliTrace 錄製程式碼執行以偵錯應用程式

其他資源

逐步解說:使用單元測試驗證 SharePoint 程式碼