Pull to refresh

Визуализация списков в отладчике Visual Studio или новое слово от «BugAid For Visual Studio»

.NET *Visual Studio *C# *
Когда приходится просматривать элементы списка (массива) в отладчике Visual Studio, например, в окне QuickWatch часто сталкивашься с не удобством просмотра сложного (или длинного) списка данных. Тяжело увидеть, например, значения поля всех элементов списка.
Данный пост показывает несколько «встроенных» способов решения этой проблемы и возможности расширения BugAid.
мало букв, но достаточно картинок.



Рассмотрим простейший пример.

    public class DataItem
    {
        public string Name { get; private set; }
        public string Description { get; private set; }

        public DataItem(string name, string description)
        {
            Name = name;
            Description = description;
        }
    }

    public class DataItems
    {       
        public List<DataItem> Items { get; private set; }

        public DataItems()
        {
            Items = new List<DataItem>();
        }
    }



Теперь, просматривая данные в отладчике мы видим примерно так:


Стандартный QuickWatch не позволяет нам увидеть определенное поле (или отформатированные поля) сразу для всех элементов списка.

Для решения этой задачи многим разработчикам известен прямолинейный способ реализиции метода ToString():

 public class DataItem
    {
        public string Name { get; private set; }
        public string Description { get; private set; }

        public DataItem(string name, string description)
        {
            Name = name;
            Description = description;
        }
        public override string ToString()
        {
            return String.Format("{0}: {1}", Name, Description);
        }
    }




или более «атрибутный» способ:
 [DebuggerDisplay("Name = {Name}, Desciption = {Description}")]
    public class DataItem
    {
        public string Name { get; private set; }
        public string Description { get; private set; }

        public DataItem(string name, string description)
        {
            Name = name;
            Description = description;
        }
    }



надо заметить, что для более сложных задач существует аттрибут DebuggerTypeProxy, но и он не предел :).

Эти два способа хороши, но есть у них тот недостаток, что все это должно быть написано в коде программы и откомпилировано. А ведь часто нужно рассматривать данные списка в разных форматах. Останавливать для этого отладчик, менять код или аттрибут, перекомпилировать и запускать заново — это очень трудоемкий способ.

Как оказалось, существует расширение BugAid для Visual Studio (как минимум c VS2010), которое решает эту задачу, а заодно и еще некоторые другие.

После установки этого расширения, появляется меню BugAid с пару опциями и собственным окном «BugAid — QuickWatch».
Теперь можно с помощью звездочки выбрать поля, которые необходимо смотреть для всех элементов списка


и вуаля



но это еще не все. даже скорее, все этим только начинается.
а ведь хочется замутить какой-нибудь формат для данных и показывать что-нибудь этакое. В этом случае можно воспользоваться "Add Custom Expression", добавить выражение для элемента списка: что то типа "[obj].Name.Length"



и «наслаждаться» кастомным форматом данных без компиляции и «контрибуции»:



а как часто хотелось бы гуглом поискать какие-нибудь данные в сложном списке?
так вот вбиваеам в поле Search то что хочется найти и получаем:





а вот сравнить бы пару элементов списка между собой.
можно и это: выбирается первый элемент через меню "Select Left Side For Compare", а затем второй — "Compare to ..." и смотрим разницу:


ну тогда бы еще хорошо бы и пофильтровать данные:




кроме этого, можно сохранять элементы и сравнивать элементы во времени.

Расширение BugAid имеет еще несколько интересных возможностей (например, для визуализации сложных выражений в операторе if).

так что я думаю, это расширение заслуживает внимание разработчиков.

пару слов о недостатках, которые я обнаружил.
  • Это еще не релиз, а бета, так что не всегда работает стабильно. Чем сложнее структуры данных, там увеличивается вероятность всяких проблем.
  • Некоторый стандартный функционал (например аттрибут DebuggerTypeProxy) не поддержан расширением.
  • Расширение не бесплатно, но есть двухмесячный бесплатный период использования.


Кстати, сайт поддержки http://bugaidsoftware.userecho.com/ довольно удобен и уважает gamification, что в данном случае скорее хорошо, чем нет.

спасибо,
Игорь.
Tags: .NETvisual studiovisual studio 2012debuggervisualizationBugAidc#
Hubs: .NET Visual Studio C#
Total votes 43: ↑40 and ↓3 +37
Comments 13
Comments Comments 13

Popular right now

Top of the last 24 hours