Статьи

Использование визуализаторов отладки C ++ в VS2015

Я давно использую визуализаторы отладки .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 :

CppDebugVisulaizer1

Я использовал  спецификатор формата  (это «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 ++)…