【问题标题】:NATVIS reinterpret type or alias typeNATVIS 重新解释类型或别名类型
【发布时间】:2020-08-23 22:41:18
【问题描述】:

在 natvis 中有没有办法将类型重新解释为已经 natvis 定义的类型?还是给它起别名?

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

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

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

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

【问题讨论】:

    标签: visual-studio natvis


    【解决方案1】:

    由于你没有展示你的类,我只能展示我自己的示例代码。

    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;
    }
    

    还有纳特维斯:

    <?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++)”设置为有用的值。

    【讨论】:

    • 它没有回答我的问题,因为你说过,它要求你事先知道每个替代名称。我想要的是使用另一个 natvis 而不知道我会提前。不过还是感谢您花时间回答。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2018-11-09
      • 2015-08-08
      相关资源
      最近更新 更多