Visual Studio 2012 Natvis跳过IndexListItems
我正在为Qt类创build一个natvis文件,并遇到了一个问题。
为了可视化QHash对象,我创build了这两种types:
<Type Name="QHashNode<*,*>"> <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<QHashNode<$T1,$T2> *>(next)</Item> </Expand> </Type> <Type Name="QHash<*,*>"> <DisplayString>{{ size={d->size} buckets={d->numBuckets} }}</DisplayString> <Expand> <IndexListItems> <Size>d->numBuckets</Size> <ValueNode Condition="reinterpret_cast<QHashNode<$T1,$T2> *>(d->buckets[$i]) != e">reinterpret_cast<QHashNode<$T1,$T2> *>(d->buckets[$i])</ValueNode> </IndexListItems> </Expand> </Type>
它非常有效,但是由于QHash在内存中不连续,因此有很多无效条目。 条件
reinterpret_cast<QHashNode< $T1,$T2> *>(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它
更多信息,请看这里