在natvis中有没有办法将一个类型重新解释为一个已经由natvis定义的类型?或者给它起别名?
例如,我想做这样的“技巧”(在我的上下文中真的很必要,即使这听起来真的很奇怪,这是一个JIT符号生成的问题)
<Type Name="std::vector<*,*>">
<DisplayString>{*(stl1.dll!std::vector<$T0,$T1> *)this}</DisplayString>
</Type>但它不能显示展开项,它只是将字符串显示为值(考虑到'DisplayString‘角色,这似乎是合乎逻辑的)。
我也尝试过SmartPointer技巧,它做得更好,但当涉及基类时,它就不起作用了(它只显示SmartPointer类型,完全忽略继承)
发布于 2020-05-10 01:12:41
因为您没有展示您的类,所以我只能展示我自己的示例代码。
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-11-19 22:31:49
我认为您尝试将一种类型表示为另一种类型(透明地)?在您的例子中,您应该使用ExpandedItem。这应该是可行的:
<Type Name="std::vector<*,*>">
<Expand>
<ExpandedItem>
*(stl1.dll!std::vector<$T0,$T1> *)this
</ExpandedItem>
</Expand>
</Type>但要注意与reinterpret_cast相关的递归和副作用
https://stackoverflow.com/questions/61678053
复制相似问题