연습: IntelliTrace를 사용하여 SharePoint 응용 프로그램 디버깅
IntelliTrace를 사용하여 SharePoint 솔루션과 같은 웹 페이지를 통합하는 응용 프로그램을 비롯한 응용 프로그램을 보다 쉽게 디버깅할 수 있습니다.일반적인 디버거에서는 현재 시점에서의 응용 프로그램 상태에 대한 스냅숏만 제공합니다.그러나 IntelliTrace를 사용하면 응용 프로그램에서 발생한 과거 이벤트와 해당 이벤트가 발생한 컨텍스트를 검토하고 이러한 이벤트와 컨텍스트로 이동할 수도 있습니다.
이 연습에서는 IntelliTrace를 사용하여 Visual Studio에서 SharePoint 프로젝트를 디버깅하는 방법을 보여 줍니다.이 프로젝트는 기능이 활성화될 때 작업을 작업 목록에 추가하고 알림을 알림 목록에 추가하는 기능 수신기를 통합합니다.기능이 비활성화되면 작업이 완료된 것으로 표시되고 두 번째 알림이 알림 목록에 추가됩니다.그러나 이 절차에는 프로젝트가 올바르게 실행되지 못하게 하는 논리 오류가 포함되어 있습니다.IntelliTrace를 사용하여 이 오류를 찾고 해결할 수 있습니다.
이 연습에서는 다음 작업을 수행합니다.
기능 및 기능 이벤트 수신자 만들기
코드를 사용하여 기능 이벤트에 응답
코드를 사용하여 작업 및 알림 목록 참조
코드를 사용하여 목록 요소 찾기 및 조작
IntelliTrace를 사용하여 코드 오류 찾기 및 해결
-
[!참고]
사용자 컴퓨터의 경우 사용자 인터페이스의 일부 요소에 대한 이름 또는 위치가 이 항목의 지침과 다를 수 있습니다.이러한 요소는 Visual Studio의 버전과 설정에 따라 달라집니다.자세한 내용은 Visual Studio 설정을 참조하십시오.
사전 요구 사항
이 연습을 완료하려면 다음 구성 요소가 필요합니다.
지원되는 Windows 및 SharePoint 버전.자세한 내용은 SharePoint 솔루션 개발 요구 사항을 참조하십시오.
Visual Studio 2012.
기능 수신기 만들기
먼저, 기능 수신기가 포함된 빈 SharePoint 프로젝트를 만듭니다.
기능 수신기를 만들려면
관리자 권한으로 실행 옵션을 사용하여 Visual Studio를 시작합니다.
메뉴 모음에서 파일, 새로 만들기, 프로젝트를 선택합니다.
새 프로젝트 대화 상자가 나타납니다.
대화 상자의 맨 위에 있는 선택 .NET Framework 3.5 .NET Framework 버전의 목록에서입니다.
사용 하려는 언어에서 확장 된 SharePoint 노드를 다음 선택의 2010 노드.
에 템플릿 창에서 선택의 SharePoint 2010 프로젝트 서식 파일을 프로젝트 이름으로 변경 IntelliTraceTest, 다음 선택은 확인 단추.
프로젝트의 SharePoint 사이트와 솔루션의 신뢰 수준을 지정할 수 있는 SharePoint 사용자 지정 마법사가 나타납니다.
선택은 팜 솔루션으로 배포 다음 선택 및 옵션 단추는 마침 단추.
IntelliTrace는 팜 솔루션에서만 작동합니다.
솔루션 탐색기, 바로 가기 메뉴를 열고를 기능 노드를 다음 선택 기능 추가.
Feature1.feature가 나타납니다.
Feature1.feature에서 바로 가기 메뉴를 열고 선택 이벤트 수신자 추가 기능에 코드 모듈을 추가 합니다.
기능 수신기에 코드 추가
다음으로, 기능 수신기의 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에서 시작 된 후는 빠른 실행 창에서 선택의 나열 연결한 다음 공지 사항 목록과 해당 내용을 보려면 작업 목록을 선택 합니다.
알림 목록에서 활성화된 기능: IntelliTraceTest_Feature1이라는 새 알림이 추가되었고 기능 비활성화: IntelliTraceTest_Feature1이라는 새 작업이 작업 목록에 추가되었습니다.작업의 상태는 "시작되지 않음"입니다.
열어 기능 비활성화는 사이트 작업 메뉴를 선택 사이트 설정, 다음 선택은 사이트 기능 관리 아래 링크 사이트 작업.선택은 Deactivate 버튼 옆에 IntelliTraceTest Feature1, 다음 선택은 이 기능 비활성화 경고 페이지에서 링크.
에 빠른 실행 창에서 선택 된 작업 링크.
작업의 상태 값이 이제 "완료"이고 작업의 완료율 값이 "100%"여야 하지만 이러한 값이 여전히 기본 설정 값으로 되어 있습니다.코드의 오류 때문에 작업이 업데이트되지 못합니다.
프로젝트 디버깅
IntelliTrace를 사용하여 코드에서 문제를 찾고 해결합니다.
프로젝트를 디버깅하려면
Visual Studio에 FeatureDeactivating 메서드를 찾아는 SPQuery qry = new SPQuery(); 줄 Visual C# 또는 Dim qry As New SPQuery() Visual Basic 선.해당 줄에 중단점을 삽입 하려면 F9 키를 선택 합니다.
기능이 비활성화될 때 문제가 발생하기 때문에 이 줄은 디버깅을 시작할 논리적 위치입니다.
F5 키를 프로그램을 다시 실행 하 고 활성화 하 고 다음이 항목 앞부분의 "프로젝트를 테스트 하려면"의 단계를 반복 하 여 해당 기능을 비활성화 하려면 선택 합니다.
FeatureDeactivating에서 중단점이 적중되면 IntelliTrace 창이 나타나고 응용 프로그램이 지금까지 수행한 모든 단계가 나열됩니다.
에 IntelliTrace 창에서의 라이브 이벤트 범주 선택은 지역 링크.
코드의 다음 줄에 단계 F11 키를 선택 합니다.
F11 키를 선택할 때마다 키 다른 "디버거:" 줄에 응용 프로그램의 IntelliTrace 기록을 디버깅 추가 됩니다.
코드의 다음 줄에 단계 F11 키를 선택 합니다.
에 지역 창에서 확장은 qry 이름을 지정 하 고 있습니다의 쿼리 값은 빨간색으로 나타납니다.
작업을 제대로 찾기 쿼리 "비활성화" 대신 "Deactive"에 대 한 검색 것이 차이 나타냅니다. 이 오류는 작업 목록의 쿼리에서 절대로 작업을 찾았음을 의미 합니다.
코드의 다음 줄에 단계 F11 키를 선택 합니다.
에 지역 창에서 확장은 taskItems 이름을 지정 하 고 있습니다는 Count 값이 영 (0).
이 값이 컬렉션의 taskItems 데이터가 없습니다 qry 항목입니다.
계속 디버깅 하려면 F5 키를 선택 합니다.
프로그램이 완료 되 면 선택은 모두 중단 IntelliTrace 창에서에서 링크를 합니다.
이 단계를 수행하여 IntelliTrace 데이터를 저장해야 합니다.
Intellitrace 도구 모음, 응용 프로그램에 대 한 호출 정보를 볼 수 있습니다 선택의 IntelliTrace 설정 열기 링크를 한 다음의 옵션 대화 상자 선택은 IntelliTrace 이벤트 및 호출 정보 옵션 단추.
IntelliTrace 도구 모음의 선택은 현재 IntelliTrace 세션 저장 디버깅 데이터를 저장 하는 단추입니다.
파일의 확장명은 .iTrace입니다.
에 Visual Studio 메뉴 표시줄에서 선택 디버깅, 디버깅 중지.
.iTrace 파일을 엽니다.
이 단계 디버깅 정보 예외 데이터 및 프로그램에 사용 되는 스레드의 목록을 제공 하는 IntelliTrace 요약 페이지를 엽니다.
확장 된 스레드 목록, 선택 주 스레드, 다음 선택은 디버깅 시작 단추.
이 단계에서는 .iTrace 데이터를 사용하여 Visual Studio에서 디버깅 세션을 시작합니다.IntelliTrace 창에 이벤트에 관한 추가 정보를 보려면 이벤트를 선택 합니다.
선택은 지역 에 링크는 디버거: 단계 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%인 것을 확인합니다.
참고 항목
개념
IntelliTrace로 기록을 검토하여 더 빠르게 코드 디버깅