연습: 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 프로젝트를 만듭니다.
기능 수신기를 만들려면
관리자 권한으로 실행 옵션을 사용하여 Visual Studio를 시작합니다.
파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
새 프로젝트 대화 상자가 나타납니다.
대화 상자 맨 위의 목록에서 .NET Framework 3.5를 클릭합니다(선택되어 있지 않은 경우).
사용할 언어에서 SharePoint 노드를 확장한 다음 2010 노드를 클릭합니다.
템플릿 창에서 빈 SharePoint 프로젝트를 클릭하고 프로젝트 이름을 IntelliTraceTest로 변경한 다음 확인을 클릭합니다.
프로젝트의 SharePoint 사이트와 솔루션의 신뢰 수준을 지정할 수 있는 SharePoint 사용자 지정 마법사가 나타납니다.
팜 솔루션으로 배포를 클릭한 다음 마침을 클릭합니다.
IntelliTrace는 팜 솔루션에서만 작동합니다.
솔루션 탐색기에서 기능 노드를 마우스 오른쪽 단추로 클릭한 다음 기능 추가를 클릭합니다.
Feature1.feature가 나타납니다.
Feature1.feature를 마우스 오른쪽 단추로 클릭한 다음 이벤트 수신자 추가를 클릭하여 코드 모듈을 기능에 추가합니다.
기능 수신기에 코드 추가
다음으로, 기능 수신기의 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가 시작된 후 탐색 창에서 목록을 클릭한 다음 알림 목록과 작업 목록을 클릭하여 내용을 확인합니다.
알림 목록에서 활성화된 기능: IntelliTraceTest_Feature1이라는 새 알림이 추가되었고 기능 비활성화: IntelliTraceTest_Feature1이라는 새 작업이 작업 목록에 추가되었습니다. 작업의 상태는 "시작되지 않음"입니다.
사이트 작업 아래에서 사이트 기능 관리를 클릭하고 IntelliTraceTest Feature1 옆의 비활성화를 클릭한 다음 경고 페이지에서 이 기능 비활성화 링크를 클릭하여 기능을 비활성화합니다.
작업의 상태 값이 이제 "완료"이고 작업의 완료율 값이 "100%"여야 하지만 이러한 값이 여전히 기본 설정 값으로 되어 있습니다. 코드의 오류 때문에 작업이 업데이트되지 못합니다.
프로젝트 디버깅
IntelliTrace를 사용하여 코드에서 문제를 찾고 해결합니다.
프로젝트를 디버깅하려면
FeatureDeactivating 메서드에서 SPQuery qry = new SPQuery(); 줄을 찾고 F9 키를 눌러 이 줄에 중단점을 삽입합니다.
기능이 비활성화될 때 문제가 발생하기 때문에 이 줄은 디버깅을 시작할 논리적 위치입니다.
F5 키를 눌러 프로그램을 다시 실행하고 이 항목의 앞부분에 있는 "프로젝트를 테스트하려면"의 단계를 반복하여 기능을 활성화한 다음 비활성화합니다.
FeatureActivated에서 중단점이 적중되면 IntelliTrace 창이 나타나고 응용 프로그램이 지금까지 수행한 모든 단계가 나열됩니다.
프로그램이 완료될 때까지 F11 키를 눌러 코드의 각 줄을 단계별로 실행합니다.
F11 키를 누를 때마다 다른 "Debugger:" 줄이 응용 프로그램의 IntelliTrace 디버깅 기록에 추가됩니다.
프로그램이 완료된 후 IntelliTrace 창에서 모두 중단 링크를 클릭합니다.
이 단계를 수행하여 IntelliTrace 데이터를 저장해야 합니다.
필요한 경우 응용 프로그램의 호출 정보를 보려면 IntelliTrace 도구 모음에서 IntelliTrace 설정 열기를 클릭한 다음 IntelliTrace 이벤트 및 호출 정보를 클릭합니다.
IntelliTrace 도구 모음에서 현재 IntelliTrace 세션 저장을 클릭하여 디버깅 데이터를 저장합니다.
파일의 확장명은 .iTrace입니다.
Visual Studio에서 디버깅 중지를 클릭합니다.
.iTrace 파일을 엽니다.
이 단계에서는 IntelliTrace 요약 페이지를 표시하는 다른 Visual Studio 인스턴스를 엽니다. 요약 페이지에서는 프로그램에서 사용되는 스레드 목록 및 예외 데이터와 같은 디버깅 정보를 제공합니다.
스레드 목록을 확장하고 주 스레드를 클릭한 다음 디버깅 시작을 클릭합니다.
이 단계에서는 .iTrace 데이터를 사용하여 Visual Studio에서 디버깅 세션을 시작합니다. IntelliTrace 창에서 이벤트에 대한 추가 정보를 보려면 이벤트를 클릭합니다.
오류가 FeatureDeactivating 메서드에서 발생하는 것으로 의심되기 때문에 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 키를 눌러 프로젝트를 다시 실행합니다.
작업 목록을 열고 Deactivate 작업의 상태 값이 이제 "완료"로 올바르게 설정되어 있고 이 작업의 완료율 값이 100%인 것을 확인합니다.