共用方式為


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

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

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

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

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

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

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

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

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

  • 注意事項注意事項

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

必要條件

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

  • 支援的 Windows 和 SharePoint 版本。 如需詳細資訊,請參閱開發 SharePoint 方案的要求

  • Visual Studio 2010 Professional SP1、Visual Studio 2010 Premium SP1 或 Visual Studio 2010 Ultimate SP1。

建立功能接收器

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

若要建立功能接收器

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

  2. 在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。

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

  3. 在對話方塊的頂端,按一下清單中的 [.NET Framework 3.5] (如果尚未選取)。

  4. 在您想要使用的語言下方,展開 [SharePoint] 節點,然後按一下 [2010] 節點。

  5. 在 [範本] 窗格中按一下 [空的 SharePoint 專案],將專案名稱變更為 IntelliTraceTest,然後按一下 [確定]。

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

  6. 按一下 [部署為陣列方案],然後按一下 [完成]。

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

  7. 在 [方案總管] 中,以滑鼠右鍵按一下 [功能] 節點,然後按一下 [加入功能]。

    隨即出現 Feature1.feature。

  8. 以滑鼠右鍵按一下 Feature1.feature,然後按一下 [加入事件接收器],將程式碼模組加入此功能。

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

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

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

  1. 在 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 = "/";
    
  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] 旁邊的 [停用],然後按一下警告頁面中的 [停用此功能] 連結。

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

對專案進行偵錯

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

若要對專案進行偵錯

  1. 在 FeatureDeactivating 方法中,找出 SPQuery qry = new SPQuery(); 行,然後按 F9 在該行插入中斷點。

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

  2. F5 再次執行程式,然後重複本主題稍早「若要測試專案」的步驟來啟用及停用此功能。

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

  3. F11 逐步完成程式碼的每一行,直到程式完成為止。

    每當您按 F11 時,另一行「偵錯工具:」就會加入至應用程式的 IntelliTrace 偵錯記錄。

  4. 在程式完成之後,請按一下 IntelliTrace 視窗中的 [全部中斷] 連結。

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

    若要選擇檢視應用程式的呼叫資訊,請按一下 IntelliTrace 工具列上的 [開啟 IntelliTrace 設定],然後按一下 [IntelliTrace 事件和呼叫資訊]。

  5. 在 IntelliTrace 工具列上按一下 [儲存目前 IntelliTrace 工作階段],以儲存及偵錯資料。

    此檔案的副檔名為 .iTrace。

  6. 在 Visual Studio 中,按一下 [停止偵錯]。

  7. 開啟 .iTrace 檔。

    這個步驟會開啟另一個 Visual Studio 執行個體來顯示 [IntelliTrace 摘要] 頁面,此頁面會提供偵錯資訊 (例如例外狀況資料) 和程式中使用的執行緒清單。

  8. 展開 [執行緒清單],再按一下 [主執行緒],然後按一下 [開始偵錯]。

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

  9. 因為我們懷疑錯誤發生在 FeatureDeactivating 方法中,所以請在 SPListItemCollection taskItems = taskList.GetItems(qry); 的 [偵錯工具:] 步驟中按一下 [區域變數] 連結。

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

  10. 在 [區域變數] 視窗中,展開變數清單、尋找 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%。

請參閱

概念

使用 IntelliTrace 進行偵錯

其他資源

使用 ALM 功能驗證及偵錯 SharePoint 程式碼

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