我正在寻找通过VS2012中的NatVis显示UUID的正确方法。我自己的uuid类型在内部使用UUID big-endian,因此强制转换为(GUID *),因为GUID在Windows中使用little-endian。所以我总是看到一个虚假的uuid。
此外,Natvis中的任何格式说明符看起来都不太好,因为使用十六进制表示法时,我无法摆脱输出中的0x。有任何想法吗?
最佳答案
这是ComicSansMS解决方案的更紧凑版本。我使用SHA1结构和可视化工具作为示例。
struct SHA1 { char hash[20]; };
namespace natvis
{
struct x4lo { unsigned __int8 v : 4; unsigned __int8 _ : 4; };
struct x4hi { unsigned __int8 _ : 4; unsigned __int8 v : 4; };
struct x8 { unsigned __int8 _; };
struct x32 { __int32 _; };
}
纳特维斯
<Type Name="natvis::x4hi">
<AlternativeType Name="natvis::x4lo" />
<DisplayString Condition="v==0">0</DisplayString>
<DisplayString Condition="v==1">1</DisplayString>
<DisplayString Condition="v==2">2</DisplayString>
<DisplayString Condition="v==3">3</DisplayString>
<DisplayString Condition="v==4">4</DisplayString>
<DisplayString Condition="v==5">5</DisplayString>
<DisplayString Condition="v==6">6</DisplayString>
<DisplayString Condition="v==7">7</DisplayString>
<DisplayString Condition="v==8">8</DisplayString>
<DisplayString Condition="v==9">9</DisplayString>
<DisplayString Condition="v==10">a</DisplayString>
<DisplayString Condition="v==11">b</DisplayString>
<DisplayString Condition="v==12">c</DisplayString>
<DisplayString Condition="v==13">d</DisplayString>
<DisplayString Condition="v==14">e</DisplayString>
<DisplayString>f</DisplayString>
</Type>
<Type Name="natvis::x8">
<DisplayString>{*(natvis::x4hi*)(this)}{*(natvis::x4lo*)(this)}</DisplayString>
</Type>
<Type Name="natvis::x32">
<DisplayString>{((natvis::x8*)this)[0]}{((natvis::x8*)this)[1]}{((natvis::x8*)this)[2]}{((natvis::x8*)this)[3]}</DisplayString>
</Type>
<Type Name="SHA1">
<DisplayString>{((natvis::x32*)hash)[0]}{((natvis::x32*)hash)[1]}{((natvis::x32*)hash)[2]} {((natvis::x32*)hash)[3]}{((natvis::x32*)hash)[4]}</DisplayString>
</Type>
如果可以访问代码中定义的字符数组,则可以使用
,1sb
字符串格式,并避免任何分支。将[DLL export/extern/static] const char* hex_chars="0123456789abcdef";
添加到natvis命名空间,并将16个条件DisplayString替换为一个:<Type Name="natvis::x4hi">
<AlternativeType Name="natvis::x4lo" />
<DisplayString>{(hex_chars+v),1sb}</DisplayString>
</Type>
据我所知,没有办法以与静态和DLL构建都可使用的方式使用上下文运算符
{,,mylib[d].dll}natvis::hex_chars
。您可以使用static const char* hex_chars = "..."
,但这会将字符串添加到每个包含 header 的.obj文件中。如果您知道不会引起膨胀的解决方案,请发表评论:)
关于c++ - 我正在寻找通过VS2012中的NatVis显示UUID的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17436643/