【发布时间】:2012-08-07 11:17:04
【问题描述】:
我想为双链表写一个natvis visualizer。列表没有存储计数节点,简单的方法效果不佳,因为扩展永远不会停止(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>
这是以前 (2010) 可视化工具的样子,使用 skip 指令,如 #list was handling this automatically:
#list可以防止无限遍历,并且可以优雅地处理循环列表。此外,您可以使用skip:表达式来表示不应报告的哨兵节点。虽然名字暗示会跳过节点,但实际上会导致遍历停止,所以如果你的哨兵节点是第一个,你应该在它之后开始遍历。
TListBidir<*,*,*>{
children
(
#list(
head: ((($T2 *)&$c)->next),
next: next,
skip : &($c)
): (($T1 *)(&$e))
)
}
如何在 natvis 中向调试器解释它应该在列表再次到达根元素时停止扩展?
【问题讨论】:
标签: c++ visual-studio debugging debuggervisualizer natvis