【问题标题】:Visual Studio 2012 Natvis skip IndexListItemsVisual Studio 2012 Natvis 跳过 IndexListItems
【发布时间】:2012-11-24 18:04:34
【问题描述】:

我正在为 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 

已经过滤掉那些无效的,但它们仍然显示为&lt;Unable to display value&gt;

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

我从来没有真正使用过 autoexp.dat 文件,这是旧方法,但是在查看安装了 Qt 插件的文件时,在我看来,声明

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

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

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

【问题讨论】:

标签: c++ qt visual-studio-2012


【解决方案1】:

根据MSDN page on writing type visualizers&lt;IndexListItems&gt; 的定义是连续的:

IndexListItems 扩展

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

另外,我可以告诉你the Qt Labs VSTools repositoryits documentation 吗?特别是tools/Qt4EEAddin/qt5.natvis 看起来很像我认为你想要写的东西? (或者它实际上你在写什么?^_^)无论哪种方式,我认为你能做的最好的就是qt5.natvis中的内容,它有一个特殊的&lt;DisplayString&gt;代表空@ 987654328@ 但不会尝试删除QHash 中的空桶。

【讨论】:

  • 这个答案/陈述非常不正确。文档说“ 在内存中是连续布局的”,而不是 是连续布局的。 IndexListItems 是作为一种使用索引的方式提供的,而 ArrayItems 没有。我发表评论是为了避免其他人在搜索 natvis 帮助时被误导。
【解决方案2】:

在我看来,只是 html 标签。

用 '' 替换它

更多信息,请参阅here

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 2022-07-10
    • 2016-07-09
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2013-12-19
    相关资源
    最近更新 更多