Как визуализировать код в visual studio
В этой статье я хочу рассказать о создании расширения для Visual Studio, которое помогает визуализировать сложные пользовательские классы в процессе отладки приложения.
Предыстория
В своем проекте мы активно используем отечественное геометрическое ядро C3D Kernel. Эта библиотека предоставляет большое количество классов для работы с кривыми, телами, поверхностями и т.п. Эти классы имеют сложную структуру и в процессе отладки приложения, используя стандартные средства визуализации Visual Studio, трудно понять, какая, например, поверхность хранится в конкретной переменной. А при отладке сложных алгоритмов очень важно понимать, что происходит с объектом на каждом шаге алгоритма.
Мы пытались обойти эту проблему различными способами. Например, выписывали координаты точек на листочек, если речь шла о простой двумерной кривой. А потом по точкам рисовали эту кривую. Второй вариант решения проблемы: сохранять в нужный момент объект в файл, а затем открывать этот файл в тестовой утилите из поставки библиотеки. Это действительно помогает при отладке, но требует довольно много ручной работы. Нужно вставить код сохранения объекта в файл, перекомпилировать приложение, выполнить необходимые действия в самом приложении для запуска конкретного алгоритма, далее открыть в утилите сохраненный файл, посмотреть результат, внести при необходимости исправления в алгоритм и повторить всю процедуру опять. В целом терпимо, но хотелось иметь возможность прямо в Visual Studio в режиме отладки навести на нужную переменную и в удобном виде посмотреть, как выглядит, хранящийся там объект.
Visual Studio Extension
В поисках решения этой проблемы я наткнулся на расширение для Visual Studio Image Watch от самой Microsoft для OpenSource библиотеки OpenCV. Это расширение позволяет просматривать в процессе отладки содержимое переменных типа cv::Mat, читай bitmap'ов. Тогда пришла идея написать похожее расширение, но для наших типов. К сожалению, найти исходный код этого расширения в открытом доступе не удалось, что на мой взгляд странно. Пришлось по крупицам собирать информацию, о том как писать подобные расширения для Visual Studio. С документацией по этой теме на msdn все печально. И примеров не очень много, а точнее один std::vector visualizer. Который еще не так то просто найти. Суть примера: визуализация на графике int чисел, лежащих в std::vector в режиме отладки:
Создание расширения
Для создания расширений нужно установить Visual Studio SDK. После установки в мастере проектов появляется новый тип проекта:
Мастер создания нового проекта создаст все необходимые файлы и сконфигурирует проект.
Я не буду повторять описание из примера от Microsoft, там уже кратко описаны шаги для создания расширения. Всем заинтересовавшимся рекомендую посмотреть описание к этому примеру. В этой статье я хотел затронуть те моменты, которые не описаны в этом примере.
Получение значения переменной
Переменная, содержимое которой мы хотим посмотреть, и само расширение располагаются в разных процессах. Из этого примера было по-прежнему непонятно, как получить данные из более сложных пользовательских типов. В примере демонстрируется прием, когда используя интерфейс IDebugProperty3, мы узнаем адрес первого элемента в векторе и адрес последнего элемента. Вычитанием адресов находим размер участка памяти и затем копируем этот участок памяти к себе в процесс. Приведу здесь код из примера:
Все бы ничего, но здесь показано, как достать данные из объекта, если эти данные хранятся в едином участке памяти. Видимо похожий подход использует и сам MS в своем расширение Image Watch. Там изображение тоже хранится в едином куске памяти и есть указатель на начало этого куска.
А что делать, если пользовательский тип имеет сложную иерархическую структуру и не похож на обычный массив данных? Все еще хуже, если класс хранит указатели на базовые классы других классов. Восстановить такой объект по кусочкам кажется нереальной задачей. Плюс такая конструкция очень хрупкая — при добавлении в какой-то промежуточный класс нового члена расширение перестает работать. В идеале мне хотелось получить сам объект или его копию. К сожалению, я не нашел способа, как такое провернуть оставаясь исключительно в рамках одного лишь расширения. Но зная, что нужные нам классы умеют сериализовывать себя в файл или в буфер в памяти, я решил, что можно использовать гибридный подход: с shared memory и вектором. Это решение не очень изящное и требует правки классов, но вполне рабочее. Плюс ничего лучше не придумалось.
Реализация
Суть метода:
В каждый класс (который мы хотим дебажить), добавляется специальный класс, содержащий одно поле: std::vector. В векторе мы будем хранить строку-маркер, по которой потом можно будет найти сериализованный объект в shared memory. Далее, в каждый не константный метод класса добавляем вызов функции сохранения класса в shared memory. Теперь при каждом изменении класса, он будет сохранять себя в shared memory.
В самом расширении: достаем из объекта строку-маркер, используя метод из примера MS. Далее, по маркеру достаем из shared memory сериализованный объект и десериализуем его. В итоге мы имеем копию объекта в нашем расширении. Ну а дальше уже дело техники. Из объекта достаем полезные нам данные и как-то показываем их в удобном виде.
HabraLine Debug Visualizer
Для демонстрации этой идеи был написан пример расширения. Так же для демонстрации работы расширения была написано простейшая библиотека. В этой библиотеке всего два класса: HabraPoint и HabraLine. Плюс пара классов, необходимых для сериализации и работы с shared memory. Класс HabraLine — это просто отрезок. Для сериализации и работы с shared memory используется boost. После установки расширения, у нас появляется возможность визуализировать значение переменных типа HabraLine.
Посмотреть расширение в действии можно на коротком видео:
Ссылка на исходники расширения: ТЫНЦ
Ссылка на демонстрационный проект: ТЫНЦ
Надеюсь эта статья будет кому-нибудь полезна и вдохновит на написание полезных расширений к Visual Studio.
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от действующих параметров или выпуска среды. Для изменения параметров выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Сброс параметров.
Код визуализатора должен быть помещен в библиотеку DLL, которая будет читаться отладчиком. Поэтому первым шагом является создание проекта библиотеки классов для библиотеки DLL.
Создание визуализатора вручную
Следуйте приведенным ниже задачам, чтобы создать визуализатор.
Создание проекта библиотеки классов
Создайте новый проект библиотеки классов.
Введите соответствующее имя для библиотеки класса, например MyFirstVisualizer , а затем нажмите Создать или ОК.
После создания библиотеки классов необходимо добавить ссылку на Microsoft.VisualStudio.DebuggerVisualizers.DLL, таким образом вы сможете использовать определенные там классы. Однако, перед добавлением ссылки, необходимо присвоить некоторым классам осмысленные имена.
Чтобы переименовать Class1.cs и добавить Microsoft.VisualStudio.DebuggerVisualizers
Щелкните правой кнопкой мыши Class1.cs в обозревателе решений и выберите команду Переименовать в контекстном меню.
Измените имя с Class1.cs на что-нибудь осмысленное, например, DebuggerSide.cs.
Visual Studio автоматически изменяет объявление класса в DebuggerSide.cs, чтобы оно соответствовало новому имени файла.
В обозревателе решений щелкните правой кнопкой мыши пункт Ссылки и в контекстном меню выберите команду Добавить ссылку.
В диалоговом окне Добавление ссылки на вкладке Обзор выберите Обзор и найдите Microsoft.VisualStudio.DebuggerVisualizers.DLL.
Библиотеку DLL можно найти в подкаталоге \Common7\IDE\PublicAssemblies в каталоге установки Visual Studio.
В файле DebuggerSide.cs добавьте следующее в директивы using :
Теперь можно приступить к написанию отладочной части кода. Этот код запускается отладчиком для отображения информации, которую требуется визуализировать. Прежде всего необходимо изменить объявление объекта DebuggerSide таким образом, чтобы он наследовал базовый класс DialogDebuggerVisualizer .
Наследование от DialogDebuggerVisualizer
В DebuggerSide.cs перейдите к следующей строке кода:
Измените код на:
DialogDebuggerVisualizer имеет один абстрактный метод — Show — который необходимо переопределить.
Переопределение метода DialogDebuggerVisualizer.Show
Добавьте следующий метод в класс public class DebuggerSide :
Добавление пространства имен System.Windows.Forms
В обозревателе решений щелкните правой кнопкой мыши пункт Ссылки и в контекстном меню выберите команду Добавить ссылку.
В диалоговом окне Добавление ссылки на вкладке Обзор выберите Обзор и найдите файл System.Windows.Forms.DLL.
В файле DebuggerSide.cs добавьте следующее в директивы using :
Чтобы отобразить выходные данные визуализатора в диалоговом окне
Добавьте следующую строку кода в метод Show :
В этом примере отсутствует код для обработки ошибок. Следует включать обработку ошибок в настоящем визуализаторе или в любом другом типе приложений.
В меню Сборка выберите команду Собрать MyFirstVisualizer. Построение проекта должно пройти без ошибок. Если при построении все же возникнут ошибки, исправьте их, прежде чем продолжить.
Отладочная часть кода написана. Тем не менее, необходимо выполнить еще одно действие: добавить атрибут, который сообщает отлаживаемому объекту, какой набор классов формирует визуализатор.
Добавление типа для визуализации кода на стороне отлаживаемого объекта
В коде на стороне отладчика тип для визуализации (источник объекта) для отлаживаемого кода указывается с помощью атрибута DebuggerVisualizerAttribute. Свойство Target задает тип для визуализации.
Добавьте следующий код атрибута в DebuggerSide.cs — после директив using , но перед namespace MyFirstVisualizer :
В меню Сборка выберите команду Собрать MyFirstVisualizer. Построение проекта должно пройти без ошибок. Если при построении все же возникнут ошибки, исправьте их, прежде чем продолжить.
На этом написание вашего первого визуализатора окончено. Если вы правильно следовали описанной выше процедуре, можно построить визуализатор и установить его в Visual Studio. Однако перед установкой визуализатора в Visual Studio следует проверить, что он работает правильно. Для этого следует создать тестовое окружение, в котором визуализатор будет запускаться без установки в Visual Studio.
Чтобы добавить тестовый метод для запуска визуализатора
Добавьте следующий метод в класс public DebuggerSide :
В меню Сборка выберите команду Собрать MyFirstVisualizer. Построение проекта должно пройти без ошибок. Если при построении все же возникнут ошибки, исправьте их, прежде чем продолжить.
Далее необходимо создать проект исполняемого файла, из которого будет вызваться библиотека DLL визуализатора. Для простоты выберите проект консольного приложения.
Добавление проекта консольного приложения в решение
В обозревателе решений щелкните правой кнопкой мыши решение, выберите пункт Добавить, а затем щелкните Новый проект.
Введите соответствующее имя для библиотеки класса, например MyTestConsole , а затем нажмите ОК.
Теперь необходимо добавить необходимые ссылки, чтобы программа MyTestConsole могла вызывать MyFirstVisualizer.
Добавление необходимых ссылок в MyTestConsole
В обозревателе решений щелкните правой кнопкой мыши MyTestConsole и в контекстном меню выберите пункт Добавить ссылку.
В диалоговом окне Добавление ссылки на вкладке Обзор выберите Microsoft.VisualStudio.DebuggerVisualizers.DLL.
Щелкните правой кнопкой мыши MyTestConsole и выберите Добавить ссылку еще раз.
В диалоговом окне Добавление ссылки перейдите на вкладку Проекты и выберите MyFirstVisualizer.
Теперь нужно добавить код, которым завершится создание тестового окружения.
Добавление кода в MyTestConsole
Щелкните правой кнопкой мыши Program.cs в обозревателе решений и выберите команду Переименовать в контекстном меню.
Измените имя c Program.cs на что-нибудь более понятное, например на TestConsole.cs.
Visual Studio автоматически изменяет объявление класса в TestConsole.cs так, чтобы оно соответствовало новому имени файла.
В TestConsole.cs добавьте следующий код к директивам using :
В метод Main добавьте следующий код:
Теперь все готово для проверки вашего первого визуализатора.
Тестирование визуализатора
В обозревателе решений щелкните MyTestConsole правой кнопкой мыши и выберите в контекстном меню команду Назначить запускаемым проектом.
В меню Отладка выберите команду Пуск.
Запускается консольное приложение, визуализатор появляется и отображает строку "Hello, World".
Поздравляем! Вы только что создали и протестировали ваш первый визуализатор.
Если вам удобнее вызывать визуализатор из Visual Studio, а не из специально подготовленной тестовой программы, визуализатор необходимо установить. Дополнительные сведения см. в разделе Практическое руководство. установить визуализатор.
Добавление объекта данных на стороне отлаживаемого объекта
В этом разделе вы переключитесь с объекта данных System.String на пользовательский объект данных.
Щелкните Далее. В появившемся диалоговом окне введите имя MyDataObject и нажмите кнопку Создать.
В пространстве имен MyDataObject замените код по умолчанию следующим кодом.
Для визуализатора, доступного только для чтения, как в этом примере, нет необходимости реализовывать методы VisualizerObjectSource.
Затем обновите проект MyFirstVisualizer, чтобы он использовал новый объект данных.
В обозревателе решений в проекте MyFirstVisualizer щелкните правой кнопкой мыши узел Ссылки и выберите команду Добавить ссылку.
В разделе Проекты выберите проект MyDataObject.
В коде атрибута файла DebuggerSide.cs обновите целевое значение, заменив System.String на MyDataObject.CustomDataObject .
В проекте MyFirstVisualizer замените код метода Show следующим кодом.
Приведенный выше код использует свойство объекта данных для отображения в заголовке формы.
Затем обновите консольное приложение, чтобы использовать пользовательский объект данных.
В обозревателе решений в проекте MyTestConsole щелкните правой кнопкой мыши узел Ссылки или Зависимости и добавьте ссылку на проект в MyDataObject .
В файле Program.cs замените код в методе Main следующим кодом.
Консольному приложению требуется ссылка на визуализатор в среде выполнения. Вы можете сохранить ссылку, оставив приведенный выше код, вместо того, чтобы раскомментировать его.
Если приложение запускается с помощью окружения теста, в приложении отображается форма Windows Forms.
После установки визуализатора установите точку останова, запустите консольное приложение и наведите указатель мыши на customDataObject . Если все настроено правильно, отобразится значок лупы .
При выборе MyFirstVisualizer с помощью значка лупы отобразится форма с текстом объекта данных в заголовке.
Создание визуализатора с помощью шаблона элемента визуализатора
На данном пошаговом руководстве было рассмотрено, как создать визуализатор вручную. Это было сделано в качестве упражнения для обучения. Теперь, когда вы знаете, как работает простой визуализатор, можно создать его проще — с помощью шаблона элемента визуализатора.
Во–первых, необходимо создать новый проект библиотеки классов.
Чтобы создать новую библиотеку классов
В меню Файл выберите пункты Создать > Проект.
В средней области выберите Библиотека классов.
В поле Имя введите соответствующее имя для библиотеки класса, например MySecondVisualizer.
Теперь можно добавить элемент визуализатора.
Чтобы добавить элемент визуализатора
В обозревателе решений щелкните правой кнопкой мыши MySecondVisualizer.
В контекстном меню выберите команду Добавить и нажмите кнопку Создать элемент.
В поле Имя введите соответствующее имя, например SecondVisualizer.cs.
Вот и все, что нужно! Просмотрите файл SecondVisualizer.cs для изучения кода, добавленного шаблоном. Можете поэкспериментировать с кодом. Теперь, когда вы изучили основы, вы сможете в будущем создавать свои собственные более сложные и полезные визуализаторы.
Эта статья является продолжением статьи из далекого 2014 года. Напомню, о чем шла речь в прошлой статье.
Какую задачу будем решать
Мы пишем ПО на языке С++, в среде Visual Studio 2015. У нас в проекте, естественно, есть пользовательские типы данных. В качестве примера таких типов могу привести класс MbSolid. Этот класс входит в состав математического ядра C3D и является абстракцией твердого тела. Тело описывается гранями, грани какими-то поверхностями и т.д. Т.е. структура класса довольно сложная, и в процессе отладки собственных алгоритмов хотелось бы визуально прикинуть, какое тело получилось на данный момент.
Картинка из прошлой статьи. В качестве примера пользовательского класса там используется класс отрезка прямой.
Для решения этой задачи было написано расширение для VisualStudio. Тут ничего интересного, ссылки есть в прошлой статье. Но возникла проблема — как в расширении VisualStudio получать данные из адресного пространства отлаживаемого (другого) процесса?
В случае простых типов данных, например массивов, всё не так уж сложно, и Microsoft даже подготовили пример для std::vector. А в нашем случае MbSolid имеет внушительную иерархию наследования и большое количество полей данных.
Модификация пользовательских типов
В прошлой статье был предложен инвазивный вариант решения этой проблемы. В каждый пользовательский класс (который мы хотим визуализировать во время отладки) добавляется поле-маркер. И в каждый не константный метод класса добавляется код для сериализации данных класса в shared memory. В поле-маркере сохраняется адрес в shared memory, куда мы сохранили данные класса. В момент отладки, при просмотре содержимого интересующей нас переменной, расширение VisualStudio находит поле-маркер и десериализует данные из shared memory, ну а дальше как-то визуализирует полученные данные.
По очевидным причинам данное решение не применимо на практике. Особенно если нет доступа к исходному тексту классов, которые мы хотим отлаживать таким способом. Ничего лучше придумать на тот момент не удалось, и эта тема заглохла на несколько лет.
Сервер в пользовательском процессе
В запросе к серверу передается адрес переменной в адресном пространстве отлаживаемого процесса. Т.к. сервер живет в том же процессе, то он без проблем получает доступ к данным по запрашиваемому адресу. Сервер, получив адрес экземпляра класса, приводит этот указатель к типу MbSolid*. Далее сервер создает аппроксимацию этого тела в виде полигональной сетки. Сериализует вычисленные вершины и индексы треугольников в json и отправляет ответ. На стороне VisualStudio расширение получает ответ, десериализует данные и отрисовывает полученную полигональную сетку в окне VisualStudio.
В результате расширению в VisualStudio даже не нужно знать структуру пользовательских данных, ему достаточно уметь отправлять правильные GET-запросы, десериализовать ответ и отрисовать треугольники в окне VisualStudio. Сервер можно расширять. Таким способом можно отлаживать любые пользовательские классы, которые можно представить в виде полигональной сетки или набора отрезков прямых, а расширение VisualStudio сможет их визуализировать:
Более того, таким способом можно даже отправлять запросы нашему серверу из браузера и визуализировать данные процесса с помощью WebGL.
Сделал простой демонстрационный пример. Запускаем наше приложение. Открываем страницу примера в браузере, на странице вводим адрес переменной, отправляем запрос к серверу и отрисовываем ответ. Не знаю, зачем это может понадобиться, но штука прикольная
Оживляем сервер
Все бы хорошо. Но есть одна проблема. Когда срабатывает точка останова, студия останавливает все потоки пользовательского процесса. В результате наш сервер тоже останавливается и не может отвечать на запросы. Для обхода этой проблемы используем следующий костыль: текущий поток, в котором сработала точка останова, замораживается, и пользовательский процесс запускается. В этот момент наш сервер оживает и расширение отправляет ему запрос с адресом интересующей нас переменной. После получения ответа выполнение пользовательского процесса снова приостанавливается, и в качестве текущего потока для дебагера устанавливается изначальный поток, в котором сработала точка останова. Для пользователя это выглядит так, будто ничего не произошло и выполнение программы остановилось в точке останова.
В коде расширения VisualStudio этот костыль выглядит следующим образом. Сработала точка останова. Пользователь запрашивает данные интересующей его переменной. В этот момент мы замораживаем текущий поток и запускаем дебагер:
Посылаем запрос серверу. Получаем ответ. Останавливаем процесс, размораживаем наш поток:
Всё! Мы получили данные от сервера и отрисовали их в окне VisualStudio. Выполнение программы находится в изначальной точке останова.
В завершение хочу отметить, что пока мне непонятны побочные эффекты, которые порождает такой подход. Буду рад, если вы поделитесь вашими соображениями в комментариях к этой статье.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
узнайте, как создать схему зависимостей в Visual Studio, чтобы визуализировать логическую архитектуру программной системы высокого уровня.
Создание схем зависимостей на основе кода
схема зависимостей позволяет организовывать Visual Studio элементы решения в логические, абстрактные группы, называемые слоями. Слои можно использовать для описания основных задач, выполняемых этими артефактами, или основных компонентов системы.
Каждый слой может содержать другие уровни, описывающие более подробные задачи. Можно также указать предполагаемые или существующие зависимости между слоями. Эти зависимости, представленные в виде стрелок, показывают уровни, которые используют или могут использовать функции, представленные другими слоями. Для поддержки архитектурного контроля кода добавьте предполагаемые зависимости в схему, а затем проверьте код по схеме.
Создание схемы зависимостей
Перед созданием схемы зависимостей убедитесь, что в решении есть проект моделирования.
[!IMPORTANT] Не добавляйте, не перетаскивайте и не копируйте существующую схему зависимостей из одного проекта моделирования в другой проект моделирования или в другое место решения. Это позволит сохранить ссылки из исходной схемы при изменении схемы. Кроме того, это может привести к тому, что проверка схемы будет работать неправильно, и к другим потенциальным проблемам, таким как отсутствующие элементы или другие ошибки при попытке открыть схему.
Вместо этого добавьте новую диаграмму зависимостей в проект моделирования. Скопируйте элементы из исходной схемы в новую схему. Сохраните оба, проект моделирования и новую диаграмму зависимостей.
Добавление новой схемы зависимостей в проект моделирования
В меню архитектура выберите пункт создать диаграмму зависимостей.
В разделе шаблоны выберите Схема зависимостей.
в Project "добавить в моделирование" найдите и выберите существующий проект моделирования в решении.
Выберите создать новый проект моделирования , чтобы добавить в решение новый проект моделирования.
[!NOTE] Схема зависимостей должна существовать в проекте моделирования. Однако ее можно связать с элементами в любом месте решения.
Не забудьте сохранить и проект моделирования, и схему зависимостей.
Перетаскивание, копирование и вставка из схемы кода
Создать карту кода для решения с помощью меню " архитектура ".
Рассмотрите возможность применения фильтра карт кода для удаления папок решений и "тестовых ресурсов", если требуется только применить зависимости в коде продукта.
На созданной карте кода удалите внешний узел или разверните его, чтобы отобразить внешние сборки в зависимости от того, требуется ли применять зависимости пространства имен. Удалите необязательные сборки из схемы кода.
Создание новой схемы зависимостей для решения с помощью меню " архитектура ".
Выберите все узлы на карте кода (используйте сочетание клавиш CTRL + A или используйте выбор с резиновой полосой, нажав клавишу SHIFT перед нажатием, перетаскиванием и выпуском.
Перетащите или скопируйте и вставьте выбранные элементы в новую схему проверки зависимостей.
В этом примере показана текущая архитектура приложения. Определите, какая архитектура должна быть архитектурой, и измените схему зависимостей соответствующим образом.
Создание слоев на основе артефактов
Слои можно создать из элементов решения Visual Studio, таких как проекты, файлы кода, пространства имен, классы и методы. При этом автоматически создаются связи между слоями и элементами, которые включаются в процесс проверки слоев.
слои можно связывать с элементами, которые не поддерживают проверку, например документы Word или PowerPoint презентации. Это позволяет связать слой с спецификациями или планами. Кроме того, слои можно связать с файлами в проектах, которые являются общими для нескольких приложений, но в процесс проверки не войдут слои, которые отображаются с универсальными именами, например "Уровень 1" и "Уровень 2".
Чтобы проверить, поддерживает ли связанный элемент проверку, откройте Обозреватель слоев и просмотрите свойство Поддержка проверки элемента. См. раздел Управление связями с артефактами.
- Перетащите элемент на схему зависимостей из следующих источников:
- Обозреватель решений
Например, можно перетаскивать файлы или проекты. - Карты кода
См. раздел сопоставление зависимостей в решениях и Использование карт кода для отладки приложений. - Представление классов или Обозреватель объектов
- Обозреватель решений
- Переименуйте слой, чтобы отразить обязанности связанного кода или артефактов.
- В Обозреватель решений откройте контекстное меню проекта моделирования и выберите команду Добавить существующий элемент.
- В диалоговом окне Добавление существующего элемента перейдите к двоичным файлам, выберите их и нажмите кнопку ОК. Двоичные файлы отображаются в проекте моделирования.
- В Обозреватель решений выберите добавленный двоичный файл и нажмите клавишу F4 , чтобы открыть окно « Свойства ».
- Для каждого двоичного файла задайте для свойства действие сборки значение Проверка.
Чтобы добавить несколько слоев, дважды щелкните средство. Когда все будет готово, выберите инструмент указатель или нажмите клавишу ESC .
Число на слое обозначает количество артефактов, связанных со слоем. Однако при чтении этого числа Помните:
Если слой ссылается на артефакт, который содержит другие артефакты, но слой не связан непосредственно с другими артефактами, то число включает только связанный артефакт. Однако для анализа в ходе проверки слоя включаются другие артефакты.
Например, если слой связан с одним пространством имен, то число связанных артефактов равно 1, даже если пространство имен содержит классы. Если слой также связан с каждым классом в пространстве имен, то число будет включать эти связанные классы.
Если слой содержит другие слои, связанные с артефактами, то слой контейнера также связывается с этими артефактами, несмотря на то, что число на уровне контейнера не включает эти артефакты.
Управление связями между слоями и артефактами
На схеме зависимостей откройте контекстное меню слоя и выберите Просмотреть ссылки.
Обозреватель слоев отображает ссылки артефактов для выбранного слоя.
Для управления этими ссылками можно использовать следующие задачи:
Реконструировать существующие зависимости
Зависимости существуют там, где артефакт, связанный с одним слоем, ссылается на артефакт, связанный с другим слоем. Например, класс в одном слое объявляет переменную, которая имеет класс в другом слое. Реконструировать существующие зависимости можно для артефактов, связанных со слоями в схеме.
[!NOTE] Для определенных видов артефактов нельзя выполнить реконструирование зависимостей. Например, зависимости не могут быть реконструированы из или в слой, связанный с текстовым файлом. Чтобы узнать, какие артефакты имеют зависимости, которые можно реконструировать, откройте контекстное меню для одного или нескольких слоев, а затем выберите Просмотреть ссылки. В обозревателе слоев изучите столбец поддерживает проверку . Зависимости не будут реконструированы для артефактов, для которых в этом столбце указано значение false.
Выберите один или несколько слоев, откройте контекстное меню для выбранного слоя, а затем выберите создать зависимости.
Если отображаются некоторые зависимости, которые не должны существовать, можно изменить эти зависимости, чтобы согласовать их с предполагаемой конструкцией.
Изменение слоев и зависимостей для отображения предполагаемого дизайна
Чтобы описать изменения, которые вы планируете внести в систему или предполагаемую архитектуру, измените схему зависимостей.
Изменение отображения элементов на схеме
Можно изменить размер, фигуру, цвет, положение слоев или цвет зависимостей, изменив их свойства.
Обнаружение шаблонов и зависимостей на карте кода
При создании схем зависимостей вы также можете создавать карты кода. Они помогают обнаружить закономерности и зависимости при анализе кода. Воспользуйтесь обозревателем решений, представлением классов или обозревателем объектов, чтобы изучить сборки, пространства имен и классы, которые часто находятся в точном соответствии с существующими слоями. Подробнее о картах кода читайте в следующих разделах:
Вообще Debugger Visualizers для обычного Visual Studio — это очень старая тема (статья 2009 года), но не очень популярная. В большинстве случаев принято учить сразу дебажить, представляя процессы в голове, а штуки вроде сортировок и списков показываются на доске. В вебе часто визуальную часть предоставляет браузер, и все всем довольны. Но бывает, что списки или деревья в голове уже не умещаются, таблицы хочется отсортировать, а графики строить не выходя из среды отладки. Для всего этого и был создан плагин для VS Code — Debug Visualizer.
Что он умеет рисовать?
-
Массивы и матрицы
Приятные плюшки — многие инструменты анимированы, позволяя отслеживать изменения в динамике. Каждый из них доступен для отдельной установки, без мастер-плагина. Наследуются они из фреймворка Visualization того же автора, в который можно контрибьютить отдельно от плагина.
Побробовать демки можно здесь, плагин доступен в VS Code или по ссылке. После установки плагин доступен по команде Debug Visualizer: New View . Выделенный фрагмент можно передать аргументом командой Debug Visualizer: Use Selection as Expression (Shift + F1).
Так как debug-visualizer работает на библиотеке node-reload, он позволяет работу в режиме hot-reload:
Удачной отладки!
Ссылки:
Github
Автор
Демо
Маркетплейс VS Code
На правах рекламы
Серверы для разработки и размещения ваших проектов — это про наши эпичные! Все серверы «из коробки» защищены от DDoS-атак, скорость интернет-канала 500 Мегабит, автоматическая установка удобной панели управления VestaCP для размещения сайтов и даже автоматическая установка Windows Server на тарифах с 2 ГБ ОЗУ или выше. Лучше один раз попробовать ;)
Читайте также: