3

natvis 有没有办法将类型重新解释为已经 natvis 定义的类型?还是别名呢?

例如,我想做这种“技巧”(在我的上下文中真的很有必要,即使这对你来说听起来很奇怪,这是 JIT 符号生成的问题)

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

但它不能显示展开项,它只是显示一个字符串作为值(考虑到“DisplayString”角色,这似乎是合乎逻辑的)。

我也尝试过一个SmartPointer技巧,它做得更好,但事实证明,当涉及基类时它不起作用(它只显示 SmartPointer 类型并完全忽略继承)

4

2 回答 2

1

我认为您试图将一种类型表示为另一种类型(透明地)?在您的情况下,您应该使用ExpandedItem. 这应该有效:

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

但要注意与相关的递归和副作用reinterpret_cast

于 2020-11-19T14:31:48.810 回答
0

由于您没有展示您的课程,我只能展示我自己的示例代码。

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>

此显示为 在此处输入图像描述

正如您所看到的AlternativeName那样,它可以解决问题,但原始类的 natvis 需要它。它要求两个类具有相同的成员/成员名称。

另请注意,在使用 natvis 时,最好启用 natvis 调试。转到菜单工具/选项/调试/“输出窗口”/“常规输出设置”并将“Natvis 诊断消息(仅限 C++)”设置为有用的值。

于 2020-05-09T17:12:40.883 回答