Visual Studio 2012 Natvis跳过IndexListItems

我正在为Qt类创build一个natvis文件,并遇到了一个问题。

为了可视化QHash对象,我创build了这两种types:

<Type Name="QHashNode&lt;*,*&gt;"> <DisplayString Condition="next->next == 0">{{ key={key} value={value} h={h}}}</DisplayString> <DisplayString>{{ key={key} value={value} h={h} withCollision }}</DisplayString> <Expand> <Item Name="NextNode">reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(next)</Item> </Expand> </Type> <Type Name="QHash&lt;*,*&gt;"> <DisplayString>{{ size={d->size} buckets={d->numBuckets} }}</DisplayString> <Expand> <IndexListItems> <Size>d->numBuckets</Size> <ValueNode Condition="reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(d->buckets[$i]) != e">reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(d->buckets[$i])</ValueNode> </IndexListItems> </Expand> </Type> 

它非常有效,但是由于QHash在内存中不连续,因此有很多无效条目。 条件

 reinterpret_cast&lt;QHashNode&lt; $T1,$T2&gt; *&gt;(d->buckets[$i]) != e 

已经过滤了那些无效的内容,但仍显示为<Unable to display value>

有谁知道是否有办法完全跳过这些条目?

我从来没有真正使用autoexp.dat文件,这是旧的方式来做到这一点,但是当安装了Qt插件的文件时,在我看来,声明

 #switch ($e.next != 0) #case 1 ( $e ) 

是不是这样,所以我希望有一种方法可以在natvis文件中做到呢?

如果任何人有兴趣,我可以给你natvis文件,但我只有QString,QByteArray,QList,QVector,QMap和(有问题的)QHash到现在。

根据写入types可视化器上的MSDN页面 , <IndexListItems>根据定义是连续的:

IndexListItems扩展

ArrayItems假定数组元素在内存中连续布局。 debugging器只需将指针递增到当前元素即可获取下一个元素。 为了支持您需要操作索引到值节点的情况,可以使用索引列表项。 下面是一个使用'IndexListItems'节点的可视化工具:[…] ArrayItems和IndexListItems唯一的区别是'ValueNode'需要隐式的'$ i'参数给第i个元素的完整expression式。

另外,我可以指点你在Qt实验室VSTools存储库 及其文档 ? 特别是tools/Qt4EEAddin/qt5.natvis看起来很像我想你想写的东西? (或者它实际上是你正在写什么?^ _ ^)无论哪种方式,我认为你能做的最好的是在qt5.natvis ,它有一个特殊的<DisplayString>为空的QHashNodes但不试图消除空桶中的QHash

在我看来,只是HTML标签。

用'<','>'replace它

更多信息,请看这里