49

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

为了可视化 QHash 对象,我创建了这两种类型:

<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-plugin 的文件时,在我看来该语句

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

确实是这样,所以我希望在 natvis 文件中也有办法做到这一点?

如果有人感兴趣,我可以给你 natvis 文件,但到目前为止我只有 QString、QByteArray、QList、QVector、QMap 和(有问题的)QHash。

4

2 回答 2

2

根据关于编写类型可视化器的 MSDN 页面<IndexListItems>根据定义是连续的:

IndexListItems 扩展

ArrayItems 假定数组元素在内存中连续布局。调试器通过简单地增加其指向当前元素的指针来获取下一个元素。为了支持需要对值节点操作索引的情况,可以使用索引列表项。这是一个使用 'IndexListItems' 节点的可视化工具: [....] ArrayItems 和 IndexListItems 之间的唯一区别是 'ValueNode' 需要对带有隐式 '$i' 参数的第 i 个元素的完整表达式。

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

于 2013-09-24T03:25:00.243 回答
0

在我看来,只是 html 标签。

将其替换为 '<' , '>'

更多信息,请参见此处

于 2013-09-19T06:15:15.457 回答