Отстраняване на грешки с Visual Studio 2005 Debugger Visualizers - Всички

Написано на 24 декември 2008 г. Публикувано в Разработка и тестване

СЪДЪРЖАНИЕ

Visual Studio 2005 има четири средства за изобразяване: набор от данни, който показва съдържанието на набора от данни в решетка на таблица, и три средства за изобразяване на текст – един за текст, един за XML и един за HTML. Следното изображение демонстрира действието на XML рендера, който предоставя по-четлив изглед на XML кода, в сравнение с простото му поставяне на един ред.

studio

Това, което е най-интересно за визуализаторите за отстраняване на грешки на Visual Studio 2005 е, че тяхната структура е вградена. Тоест можем да създадем наш собствен рендер и да го вградим във Visual Studio! В тази статия ще разгледаме основите на рендерингите за отстраняване на грешки, ще проучим някои вградени инструменти, ще разгледаме няколко безплатни и ще научим как да създадете свой собствен рендър за отстраняване на грешки! Прочетете, за да научите повече за него!

Основи на инструментите за визуализация

За да използвате инструментите за визуализация на дебъгера, създайте проект във Visual Studio 2005, който има няколко низови променливи. Дайте някакъв валиден XML код; присвояване на другото HTML съдържание; третата е стойност на дълъг низ. След това задайте точка на прекъсване във вашия код и след това започнете отстраняване на грешки. В прозореца за наблюдение, на връзка към тези три променливи, съдържащи XML, HTML и стойност на дълъг низ, ще видите икона на лупа вдясно от стойността на всяка променлива, както е показано по-долу.

грешки

Щракването върху иконата на лупа ще покаже избрания рендър,и също така можете да изберете желания инструмент, като щракнете върху стрелката до иконата. Във въведението към тази статия ви показах изхода, изобразен от XML рендера; По-долу ще видите примери, демонстриращи инструменти за визуализация на текст (Текст) и HTML маркиране.

studio
отстраняване

Анализиране на функционалността на инструментите за визуализация на дебъгера

Като цяло програмите за изобразяване на грешки трябва да изпълняват 2 задачи: първо, когато получат екземпляр на обект от определен тип, те трябва да създадат потребителски интерфейс, който показва подробно описание на обекта; второ, те трябва да съдържат необходимото свързване за взаимодействие с дебъгера във Visual Studio. Сложността на създаването на рендеринг е, че той работи в 2 различни процеса: в програмата за отстраняване на грешки на Visual Studio, а също и в изпълняваната програма. Инструментът е имплементиран като сборка, която съдържа метаданни, които указват конкретния тип данни, с които рендерът трябва да работи. Когато разработчикът започне да отстранява грешки в Visual Studio, средата зарежда всички програми за визуализация и определя с какви типове данни могат да работят. Освен това, когато разработчик задържи курсора на мишката върху променлива в прозореца на кода или в прозорците Locals, Autos и Watch, Visual Studio показва икона на лупа.

Щракването върху иконата кара програмата за изобразяване да зареди тази информация от програмата и да я предаде на програмата, намираща се в програмата за отстраняване на грешки, която ще покаже информацията на екрана. Това прехвърляне на информация от една част на инструмента към друга се извършва с помощта на двоична сериализация чрез потоци; крайният резултат ще бъде, че всички обекти са преминали между даннитечасти от програмата за изобразяване трябва да бъдат индексирани. След като рендърът, работещ в дебъгера, получи обект за показване, той е отговорен за създаването на потребителския интерфейс за показване на стойността на обекта. Това в повечето случаи включва създаване на формуляр (Windows Form) и зареждане на стойности в контролите въз основа на получената информация за обекта.

Разширяване на Studio 2005 със специални инструменти за визуализация

Трябва да проучите някои безплатни инструменти за визуализация (много от тях също имат наличен изходен код):

Създаваме специализиран инструмент за визуализация

Създаването на персонализиран рендър обикновено включва създаване на три свързани обекта:

  1. клас визуализатор - когато разработчикът щракне върху иконата на лупа по време на сесия за отстраняване на грешки, трябва по някакъв начин да обвържем съответния обект и да покажем информацията в желания формат. Актът за получаване на информация за обекта от дебъгера и предаването й към потребителския интерфейс е отговорност на класа за изобразяване. Този клас наследява класа DialogDebuggerVisualizer и предоставя метода Show(), който е отговорен за получаване на информация и извикване на потребителския интерфейс. Този клас трябва също да съдържа атрибут на асемблиране, указващ, че средството за изобразяване е от подходящия тип данни.
  2. изходен клас („източник“) – Отговорност на изходния клас е да вземе обекта, върху чиято икона на лупа е щракнато, и да предаде информацията за този обект на дебъгера. Този клас наследява от VisualizerObjectSource и има метод GetData(object, Stream), който предоставясериализирана версия на обекта към класа за изобразяване. По-специално, първият входен параметър на метода GetData() е обектът, върху чиято икона на лупа е щракнато; вторият входен параметър е потокът, към който обектът трябва да бъде сериализиран.
  3. потребителски интерфейс ("потребителски интерфейс") - потребителският интерфейс, който ще показва информация. Обикновено това включва създаване на формуляр (или множество формуляри), добавяне на подходящи елементи на потребителския интерфейс (текстови полета, дървовидни изгледи и т.н.) и предаване на класа за изобразяване на информацията за показване.
За да демонстрирам това взаимодействие, създадох доста прост рендър, предназначен да показва сървърни променливи. Този рендерер е свързан с класа System.Web.UI.Page. (Можете да изтеглите този клас в края на статията.)

public override void GetData(Object target, System.IO.Stream outgoingData) if (target != null && target is Page) Page p = (Page)target;

// Избутване на съдържание от Request.ServerVariables към // локална NameValueCollection b/c Request.ServerVariables // не е сериализирана. Колекция NameValueCollection nvc = нова колекция NameValueCollection(); foreach (ключ за низ в p.Request.ServerVariables) nvc.Add(ключ, p.Request.ServerVariables[ключ]);

// сериализиране на nvc за поточно предаване на изходящи данни BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(outgoingData, nvc); > >

След това в метода Show() на класа за изобразяване десериализираме информацията от метода GetData() и създаваме потребителския интерфейс. Това става с този код:

protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) // Десериализиране на потока, върнат от GetData() в NameValueCollection NameValueCollection vars = null; използване на (Stream dataStream = objectProvider.GetData()) BinaryFormatter formatter = new BinaryFormatter(); vars = formatter.Deserialize(dataStream) като NameValueCollection; >

// Създаване на UI форма чрез предаване на NameValueCollection използвайки (VisualizerForm displayForm = new VisualizerForm()) displayForm.Visualize(vars); windowService.ShowDialog(displayForm); > >

Класът VisualizerForm е формуляр на Windows, който съдържа контрола ListView. Методът Visualize(NameValueCollection) на класа VisualizerForm (написан от мен) взема предадения обект NameValueCollection и изхвърля съдържанието му в ListView.

Също така в класа за рендиране е включен атрибутът DebuggerVisualizer, който свързва рендера с типа данни System.Web.UI.Page:

[assembly: DebuggerVisualizer( typeof(skmVisualizers.ServerVariables.Visualizer), typeof(skmVisualizers.ServerVariables.ServerVariablesControlSource), Target = typeof(System.Web.UI.Page), Description = "Визуализирайте сървърните променливи на страницата.") ]

Прилагаме и тестваме специализиран инструмент за визуализация

След като успешно създадете своя персонализиран рендерер, можете да го използвате с лекота. Просто копирайте сборката (DLL файл) в папката My Documents\Visual Studio 2005\Visualizers. И това е всичко! За да използвате програмата за изобразяване, отворете Visual Studio 2005, след това създайте нов проект за уеб сайт и задайте точка на прекъсване във вашия код.След това стартирайте програмата за отстраняване на грешки. Когато достигнете точката на прекъсване, въведете Page в прозореца за наблюдение (или това в C# или Me във VB). Трябва да видите малка икона на лупа в прозореца за наблюдение. Кликнете върху него и трябва да видите същия диалогов прозорец, както е показано по-долу. Ако изберете конкретен елемент от ListView, ще ви бъде предоставена по-подробна информация.

грешки

грешки

Едно от главоболията при разработването на рендери за отстраняване на грешки е тяхното тестване/дебъгване. Единственият начин да сте сигурни, че имате напълно работещ дебъгер, е да създадете сборка на вашия инструмент, да го копирате ръчно в директорията Visualizers на Visual Studio 2005, да стартирате VS и да започнете отстраняване на грешки. Ако откриете грешка и искате да направите някакви промени, ще трябва да спрете отстраняването на грешки, да затворите Visual Studio, да направите промени в програмата за изобразяване, да компилирате отново и копирате файла в директорията Visualizers, да рестартирате VS и да се върнете към програмата за отстраняване на грешки.

Има друг, по-продуктивен начин, който ви позволява да влезете в кода за изобразяване чрез дебъгера. Тази техника включва създаване на самостоятелно приложение (конзолно приложение). Единственият недостатък е, че тъй като всъщност не сте стартирали приложението, ще трябва да имитирате сериализиран обект от оригиналния клас, което означава, че няма да имате достъп до специфичната за заявката информация, която бихте получили от действителното отстраняване на грешки. (Това е голям проблем при работа с истински ASP.NET контроли, като класа Page.)