Natvis визуализатор для C++ объединения / структуры

Я пытаюсь реализовать персональный визуализатор, используя визуализатор msvc natvis. Проблема в том, что я не знаю, как это сделать в отношении союза. Простой пример со структурой (value) содержащий объединение двух структур (string1 а также string2):

typedef struct value                      
{   int type;                                              /* variable type */
    union                                                         
    {
         string1    sval;                                 
         string2    sval2;                                  
    } t;
} 

typedef struct string1
{  
    int    size;
    char  *data;
} aString1;

typedef struct string2
{   
    int    size;
    char  *data;
} aString2;

Я могу создать два типа для string1 и string2 со следующим кодом в natvis:

<Type Name="string1"> /// (A) preview
    <DisplayString>{{ string 1 }}</DisplayString>
    <Expand>
      <Item Name="text">data</Item>
    </Expand>
  </Type>
<Type Name="string2">  /// (B) preview
    <DisplayString>{{ string 2 }}</DisplayString>
    <Expand>
      <Item Name="text">data</Item>
    </Expand>
  </Type>

Но как я могу автоматически просмотреть эти типы, когда у меня есть переменная "значение" (объединение). Я застрял в этой точке: (при условии, что тип переменной равен 1, чтобы указать string1, и 2 для string2). Я сделал:

 <Type Name="value">
    <DisplayString>{{Value}}</DisplayString>
    <Expand>
            <Synthetic Name="String 1 Name" Condition="type==1"> // assume type of string1 = 1
                  /// here i want to call preview I have created for string1 in (A)
            </Synthetic>

             <Synthetic Name="String 2 Name" Condition="type==2"> // assume type of string2 = 2
                 /// here i want to call preview I have created for string2 in (B)
             </Synthetic>
   </Expand>
</Type>

Поэтому мне бы хотелось, чтобы в зависимости от значения типа отладка показывала правильный визуализатор. Можете ли вы объяснить мне, как бороться с союзом с natvis? или есть где нибудь пример? (официальная документация по msvc не рассматривает союзы..) Обвиулси этот пример не имеет смысла, но он просто для понимания, потому что у меня гораздо более сложный союз.

1 ответ

Решение

Следующее должно работать:

<Type Name="value">
  <DisplayString Condition="type == 1">{t.sval}</DisplayString>
  <DisplayString Condition="type == 2">{t.sval2}</DisplayString>
  <Expand>
    <ExpandedItem Condition="type == 1">t.sval</ExpandedItem>
    <ExpandedItem Condition="type == 2">t.sval2</ExpandedItem>
  </Expand>
</Type>

ExpandedItem удаляет представление объединения и использует string1 или соотв. вместо расширения string2, в зависимости от значения типа.

Я не пытался использовать XML, который я разместил здесь, поэтому могут быть некоторые синтаксические ошибки, но вы должны быть в состоянии заставить его работать с небольшими изменениями (если таковые имеются).

Другие вопросы по тегам