分享方式:


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

藉由使用 IntelliTrace,您可以更輕鬆地對 SharePoint 解決方案進行偵錯。 傳統偵錯工具目前只會提供解決方案的快照集。 不過,您可以使用 IntelliTrace 來檢閱您解決方案中過去發生的事件,以及發生的內容,並瀏覽至程式碼。

本逐步解說示範如何使用 Microsoft Monitoring Agent 從已部署的應用程式收集 IntelliTrace 資料,對 Visual Studio 中的 SharePoint 專案進行偵錯。 若要分析該資料,您必須使用 Visual Studio Enterprise。 此專案會納入功能接收器,當功能啟動時,會將工作新增至 [工作] 清單,並將公告新增至 [公告] 清單。 停用此功能時,工作會標示為已完成,並將第二個公告新增至 [公告] 清單。 不過,此程序包含邏輯錯誤,讓專案無法正確執行。 藉由使用 IntelliTrace,您將會找到錯誤並加以更正。

適用於:本主題中的資訊適用於在 Visual Studio 中建立的 SharePoint 解決方案。

本逐步解說將說明下列工作:

必要條件

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

  • 支援的 Windows 和 SharePoint 版本。

  • Visual Studio Enterprise。

建立功能接收器

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

  1. 建立以您已安裝 SharePoint 版本為目標的 SharePoint 解決方案專案,並將其命名為 IntelliTraceTest

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

  2. 選擇 [部署為伺服器陣列解決方案] 選項按鈕,然後選擇 [完成] 按鈕。

    IntelliTrace 只會在伺服器陣列解決方案上運作。

  3. 在 [方案總管] 中,開啟 [功能] 節點的捷徑功能表,然後選擇 [新增功能]

    Feature1.feature 隨即出現。

  4. 開啟 Feature1.feature 的捷徑功能表,然後選擇 [新增事件接收器],將程式碼模組新增至功能。

將程式碼新增至功能接收器

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

  1. Feature1EventReceiver 類別頂端,新增下列程式碼,其會宣告可指定 SharePoint 網站和子網站的變數:

    // SharePoint site and subsite.
    private string siteUrl = "http://localhost";
    private string webUrl = "/";
    
  2. 以下列程式碼取代 FeatureActivated 方法:

    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 an 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 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 override void FeatureDeactivating(SPFeatureReceiverProperties properties)
    {
        // The following line induces an error to demonstrate debugging.
        // Remove this line later for proper operation.
        throw new System.InvalidOperationException("A serious error occurred!");
        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 that 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'>Deactivate</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 解決方案,以測試其是否正常運作。

重要

針對此範例,FeatureDeactivating 事件處理常式中會擲回錯誤。 稍後在本逐步解說中,您會使用資料收集器建立的 .iTrace 檔案來找出此錯誤。

  1. 將解決方案部署至 SharePoint,然後在瀏覽器中開啟 SharePoint 網站。

    此功能會自動啟動,導致其功能接收者新增公告和工作。

  2. 顯示 [公告] 和 [工作] 清單的內容。

    [公告] 清單應該有名為啟動功能:IntelliTraceTest_Feature1 的新公告,而 [工作] 清單應該有名為停用功能:IntelliTraceTest_Feature1 的新工作。 如果遺漏其中一個項目,請確認功能是否已啟動。 如果未啟動,請加以啟動。

  3. 執行下列步驟以停用功能:

    1. 在 SharePoint 的 [網站動作] 功能表上,選擇 [網站設定]

    2. 在 [網站動作] 底下,選擇 [管理網站功能] 連結。

    3. IntelliTraceTest Feature1 旁邊,選擇 [停用] 按鈕。

    4. 在 [警告] 頁面上,選擇 [停用此功能] 連結。

      FeatureDeactivating() 事件處理常式會擲回錯誤。

使用 Microsoft Monitoring Agent 收集 IntelliTrace 資料

如果您在執行 SharePoint 的系統上安裝 Microsoft Monitoring Agent,您可以使用比 IntelliTrace 傳回的一般資訊更具體的資料來偵錯 SharePoint 解決方案。 代理程式可在 Visual Studio 外部運作,方法是使用 PowerShell Cmdlet 在 SharePoint 解決方案執行時擷取偵錯資訊。

注意

本節中的組態資訊專屬於此範例。 如需其他組態選項的詳細資訊,請參閱使用 IntelliTrace 獨立收集器

  1. 在執行 SharePoint 的電腦上,設定 Microsoft Monitoring Agent 並開始監視您的解決方案

  2. 停用功能:

    1. 在 SharePoint 的 [網站動作] 功能表上,選擇 [網站設定]

    2. 在 [網站動作] 底下,選擇 [管理網站功能] 連結。

    3. IntelliTraceTest Feature1 旁邊,選擇 [停用] 按鈕。

    4. 在 [警告] 頁面上,選擇 [停用此功能] 連結。

      發生錯誤 (在此案例中是因為 FeatureDeactivating() 事件處理常式中擲回的錯誤)。

  3. 在 PowerShell 視窗中,執行 Stop-WebApplicationMonitoring 命令來建立 .iTrace 檔案、停止監視,然後重新啟動 SharePoint 解決方案。

    Stop-WebApplicationMonitoring "<SharePointSite>\<SharePointAppName>"

偵錯和修正 SharePoint 解決方案

現在,您可以在 Visual Studio 中檢視 IntelliTrace 記錄檔,尋找 SharePoint 解決方案中的錯誤並加以修正。

  1. 在 Visual Studio 的 \IntelliTraceLogs 資料夾中,開啟 .iTrace 檔案。

    [IntelliTrace 摘要] 頁面隨即出現。 因為錯誤未處理,因此 SharePoint 相互關聯識別碼 (GUID) 會出現在 [分析] 區段未處理的例外狀況區域中。 如果您想要檢視發生錯誤的呼叫堆疊,請選擇 [呼叫堆疊] 按鈕。

  2. 選擇 [偵錯例外狀況] 按鈕。

    如果出現提示,請載入符號檔。 在 [IntelliTrace] 視窗中,例外狀況會醒目提示為「擲回:發生嚴重錯誤!」。

    在 IntelliTrace 視窗中,選擇例外狀況以顯示失敗的程式碼。

  3. 開啟 SharePoint 解決方案,然後註解化或移除 FeatureDeactivating() 程序頂端的 throw 陳述式,以修正錯誤。

  4. 在 Visual Studio 中重建解決方案,然後將其重新部署至 SharePoint。

  5. 執行下列步驟以停用功能:

    1. 在 SharePoint 的 [網站動作] 功能表上,選擇 [網站設定]

    2. 在 [網站動作] 底下,選擇 [管理網站功能] 連結。

    3. IntelliTraceTest Feature1 旁邊,選擇 [停用] 按鈕。

    4. 在 [警告] 頁面上,選擇 [停用此功能] 連結。

  6. 開啟 [工作] 清單,並確認 [停用] 工作的 [狀態] 值為 [已完成],且其 [完成率] 值為 100%。

    程式碼現在會正常執行。