我想为双链表编写一个natvis visualizer。该列表没有存储计数节点,并且简单的方法不能很好地工作,因为展开从不停止(next从不为空,列表的最后一项指向列表根目录)。使用natvis的圆形双链表可视化
<Type Name="TListBidir<*>">
<Expand>
<LinkedListItems>
<HeadPointer>next</HeadPointer>
<NextPointer>next</NextPointer>
<ValueNode>($T1 *)this</ValueNode>
</LinkedListItems>
</Expand>
</Type>
我希望我将能够添加一个条件属性的NextPointer与表头进行比较,但作为NextPoint公司在节点的上下文中计算的,我不知道该怎么把它与比较:
<NextPointer Condition="next!=XXXXXXXXX">next</NextPointer>
这是怎么与以前的(2010)展示台长得很像,利用跳转指令,为#list was handling this automatically:
#list
是对无限特拉沃保护并会优雅地处理一份通告。此外,您可以使用skip:
表达式来表示不应报告的哨兵节点。尽管名称意味着该节点将被跳过,但实际上会导致遍历停止,所以如果您的哨兵节点是第一个,则应该在它之后开始遍历。
TListBidir<*,*,*>{
children
(
#list(
head: ((($T2 *)&$c)->next),
next: next,
skip : &($c)
): (($T1 *)(&$e))
)
}
我怎样才能在natvis到调试器应该停止扩大名单一旦再次到达根元素解释一下吗?
嗯,你没有三元向后?它不应该是'next!= container-> head?下一个:0'?或者我可能不了解你在做什么? – Adrian 2016-03-31 23:05:17
是的,它在这个版本中倒退了;我会纠正它。我使用的实际代码要复杂得多,因为数据结构要复杂得多,但是在一些额外的指针间接指针仍然松散地归结为一个循环链表之后。我搞砸了这个帖子的核心逻辑。 – 2016-04-02 23:23:14
我不知道VS2012,但在VS2013中,如果列表最终碰到''中描述的指针,它也会停止列表,就好像''指向nullptr。 –
Adrian
2016-04-04 20:14:03