NATVIS переинтерпретирует тип или псевдоним - PullRequest
0 голосов
/ 08 мая 2020

Есть ли в natvis способ переинтерпретировать тип в уже определенный natvis тип? или его псевдоним?

Например, я хотел бы проделать такой «трюк» (действительно необходимый в моем контексте, даже если это действительно звучит для вас очень странно, это вопрос генерации JIT-символа)

<Type Name="std::vector&lt;*,*&gt;">
<DisplayString>{*(stl1.dll!std::vector&lt;$T0,$T1&gt *)this}</DisplayString>
</Type>

Но он не работает для отображения раскрываемых элементов, он просто отображает строку как значение (что кажется логичным, учитывая роль DisplayString).

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

1 Ответ

0 голосов
/ 09 мая 2020

Поскольку вы не показываете свои классы, я могу просто показать свой собственный пример кода.

struct A { int x, y; };
struct B { int x, y; };
struct C { int v, w; };

int main()
{
    A a{ 1,2 };
    B b{ 3,4 };
    C c{ 5,6 };
    return 0;
}

И natvis:

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="A">
    <AlternativeType Name="B"/>
    <AlternativeType Name="C"/>
    <DisplayString>A {x}, {y}</DisplayString>
  </Type>
</AutoVisualizer>

Это отображается как enter image description here

Как видите, AlternativeName делает свое дело, но он требуется на natvis для исходного класса. И это требует, чтобы оба класса имели одинаковые члены / имена членов.

Обратите также внимание, что при игре с natvis рекомендуется включить отладку natvis. Go в меню Инструменты / Параметры / Отладка / «Вывод Windows» / «Общие параметры вывода» и установите для параметра «Диагностика Natvis c сообщения (только C ++)» полезное значение.

...