Я давно использую визуализаторы отладки .NET (и атрибут DebuggerDisplay) в течение долгого (долгого) времени, и мне нравится, как они делают мой код легким для отладки. До недавнего времени я не знал, что Visual Studio имеет аналогичные возможности для C ++.
Любой разработчик C ++, вооруженный Visual Studio, может использовать файлы XML для создания отладочных визуализаторов. В Visual Studio 2015 больше нет необходимости развертывать эти визуализаторы на каждом из них на каждом компьютере разработчика — просто добавьте новый, простой в написании визуализатор в свой проект и Ваша команда получает возможность автоматически использовать его через магию контроля источников.
Рассмотрим следующий класс:
class Customer
{
int m_id;
string m_firstName;
string m_surname;
int m_age;
Gender m_gender;
string m_emailAddress;
string m_telephoneNumber;
Address m_address;
// ...
};
Чтобы использовать визуализатор отладки, просто добавьте новый файл natvis — Add new Item и выберите шаблон файла визуализации отладчика (.netvis) .
И preto — новый файл визуализации отладки будет добавлен в ваш проект.
После небольшой переделки я создал следующее:
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="Customer">
<DisplayString>Name: {m_firstName}</DisplayString>
<Expand>
<Item Name="Id">m_id</Item>
<Item Name="Gender">m_gender</Item>
<Item Name="Age">m_age</Item>
<Item Name="Address">m_address</Item>
</Expand>
</Type>
</AutoVisualizer>
Который было действительно просто написать:
- Чтобы отобразить имя клиента автоматически, я добавил DisplayString с « Name:» и значением в фигурных скобках.
- Сейчас меня интересуют только четыре поля клиента, поэтому я добавил Expends с этими полями.
И я получил следующее в окне просмотра:
Это хорошо, но не очень — я хотел бы видеть полное имя клиента и поэтому немного подправил DisplayString :
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="Customer">
<DisplayString>Name: {m_firstName, sb} {m_surname, sb}</DisplayString>
<Expand>
<Item Name="Id">m_id</Item>
<Item Name="Gender">m_gender</Item>
<Item Name="Age">m_age</Item>
<Item Name="Address">m_address</Item>
</Expand>
</Type>
</AutoVisualizer>
И я сделал это во время сеанса отладки — просматривал результаты каждый раз, когда я сохранял файл natvis :
Я использовал спецификатор формата (это «sb»), чтобы удалить кавычки и сделать имя более понятным для человека. Фактически я могу использовать другой форматер для Gender — en (для Enum).
Я также хотел бы сделать адрес клиента видимым в строке дисплея. Поскольку Address — это класс, я сначала определю для него визуализатор (взорвите визуализатор клиента) и обновлю визуализатор клиента, чтобы использовать адрес как часть отображаемой строки:
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="Customer">
<DisplayString>{m_firstName, sb} {m_surname, sb} [{m_address}]</DisplayString>
<Expand>
<Item Name="Id">m_id</Item>
<Item Name="Gender">m_gender, en</Item>
<Item Name="Age">m_age</Item>
<Item Name="Address">m_address</Item>
</Expand>
</Type>
<Type Name="Address">
<DisplayString>{m_streetAddress, sb}, {m_city, sb}, {m_country, sb} Zip:{m_zipCode}</DisplayString>
</Type>
</AutoVisualizer>
Это не кажется много — но для получения аналогичного поведения в .NET мне нужно было использовать OzCode — так как вложенный / рекурсивный DebugDisplayAttribute не поддерживается в .NET.
Вывод
В VS2015 есть и другие отличные функции, связанные с визуализацией отладки, но я считаю, что простота использования и развертывания действительно изменила игру.
Теперь, когда я смотрю на большой вектор Клиентов без необходимости тратить и находить то, что я хочу:
Так просто, как, что.
Удачного кодирования (даже в C ++)…