我想为双链表编写一个natvis 可视化工具。该列表没有存储计数节点,并且简单的方法效果不佳,因为扩展永远不会停止(next 永远不会为空,列表的最后一项指向列表根)。
<Type Name="TListBidir<*>">
<Expand>
<LinkedListItems>
<HeadPointer>next</HeadPointer>
<NextPointer>next</NextPointer>
<ValueNode>($T1 *)this</ValueNode>
</LinkedListItems>
</Expand>
</Type>
我希望我能够添加一个 Condition 属性,将 NextPointer 与列表头进行比较,但是由于 NextPoint 在节点的上下文中进行评估,我不知道将其与什么进行比较:
<NextPointer Condition="next!=XXXXXXXXX">next</NextPointer>
这是使用 skip 指令的以前(2010)可视化工具的样子,因为#list 会自动处理:
#list
可以防止无限遍历,并且可以优雅地处理循环列表。此外,您可以使用skip:
表达式来表示不应报告的哨点节点。虽然名字暗示该节点将被跳过,但它实际上会导致遍历停止,所以如果你的哨兵节点是第一个,你应该在它之后开始遍历。
TListBidir<*,*,*>{
children
(
#list(
head: ((($T2 *)&$c)->next),
next: next,
skip : &($c)
): (($T1 *)(&$e))
)
}
我如何在 natvis 中向调试器解释它一旦再次到达根元素就应该停止扩展列表?