C++ 基于natvis的循环双链表可视化
我想为一个双链接列表写一篇文章。列表没有存储计数节点,简单的方法也不能很好地工作,因为扩展从未停止过(next从不为null,列表的最后一项指向列表根)C++ 基于natvis的循环双链表可视化,c++,visual-studio,debugging,debuggervisualizer,natvis,C++,Visual Studio,Debugging,Debuggervisualizer,Natvis,我想为一个双链接列表写一篇文章。列表没有存储计数节点,简单的方法也不能很好地工作,因为扩展从未停止过(next从不为null,列表的最后一项指向列表根) 如何在natvis中向调试器解释,一旦列表再次到达根元素,它就应该停止扩展列表?natvis框架目前不支持不提供计数的循环链接列表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永远继续下去。natvis框架目前不支持没有计数的循环链表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永
如何在natvis中向调试器解释,一旦列表再次到达根元素,它就应该停止扩展列表?natvis框架目前不支持不提供计数的循环链接列表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永远继续下去。natvis框架目前不支持没有计数的循环链表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永远继续下去。我也遇到了类似的问题,不是循环列表,而是末尾有一个指向自身的哨兵节点,并提出了一个有趣的解决方案,可能适合您的需要:您可以使用三元运算符来伪造真正的终止。
中的表达式可以是用香草C编写的任何东西,因此可以在其中进行真正的计算(但遗憾的是,没有递归)
(请注意,不允许在
上放置条件
属性,因此三元运算符是实现条件的唯一方法。)
在我的例子中,列表终止如下:
<LinkedListItems>
<HeadPointer>this</HeadPointer>
<NextPointer>next != this ? next : 0</NextPointer>
<ValueNode>items</ValueNode>
</LinkedListItems>
如果你没有某种类型的
容器
返回指针,那么你可能在这方面运气不佳,因为在循环链接列表中只查看一个节点无法回答它是否实际上是“最后一个”节点。我也有类似的问题,不是循环列表,但在末端有一个指向自身的哨兵节点,并提出了一个有趣的解决方案,可能适合您的需要:您可以使用三元运算符来伪造一个真正的终端。
中的表达式可以是用香草C编写的任何东西,因此可以在其中进行真正的计算(但遗憾的是,没有递归)
(请注意,不允许在
上放置条件
属性,因此三元运算符是实现条件的唯一方法。)
在我的例子中,列表终止如下:
<LinkedListItems>
<HeadPointer>this</HeadPointer>
<NextPointer>next != this ? next : 0</NextPointer>
<ValueNode>items</ValueNode>
</LinkedListItems>
但是,如果您没有某种类型的
容器
返回指针,您可能在这方面运气不佳,因为在循环链接列表中只查看单个节点无法回答它是否实际上是“最后一个”节点。您可以使用CustomListItems
元素:
*iter
iter=iter-next\u元素
CustomListItems
允许您将头部保存在变量中,以便在遍历列表时使用。如果您的头部具有不同的类型,则需要将列表节点强制转换为节点类型。您可以使用CustomListItems
元素执行此操作:
*iter
iter=iter-next\u元素
CustomListItems
允许您将头部保存在变量中,以便在遍历列表时使用。如果您的头部有不同的类型,那么您需要将列表节点强制转换为节点类型。嗯,您没有向后的三元组吗?它不应该是下一个吗容器->头部?下一步:0?或者也许我不明白你在做什么?是的,这是一个倒退的版本;我会改正的。我使用的实际代码要复杂得多,因为数据结构要复杂得多,但经过几次额外的指针间接操作后,仍然松散地归结为一个循环链表。我在这篇文章中把核心逻辑提取出来的过程搞砸了。我不知道VS2012,但在VS2013中,如果列表最终命中了
中描述的指针,它也会停止列表,就像
指向nullptr一样。嗯,难道你没有三元倒排吗?它不应该是下一个吗容器->头部?下一步:0?或者也许我不明白你在做什么?是的,这是一个倒退的版本;我会改正的。我使用的实际代码要复杂得多,因为数据结构要复杂得多,但经过几次额外的指针间接操作后,仍然松散地归结为一个循环链表。我在为这篇文章提取核心逻辑时出错了。我不知道VS2012,但在VS2013中,如果列表最终命中
中描述的指针,它也会停止列表,就像
指向nullptr一样。
TListBidir<*,*,*>{
children
(
#list(
head: ((($T2 *)&$c)->next),
next: next,
skip : &($c)
): (($T1 *)(&$e))
)
}
<LinkedListItems>
<HeadPointer>this</HeadPointer>
<NextPointer>next != this ? next : 0</NextPointer>
<ValueNode>items</ValueNode>
</LinkedListItems>
<LinkedListItems>
<HeadPointer>container->head</HeadPointer>
<NextPointer>next != container->head ? next : 0</NextPointer>
<ValueNode>items</ValueNode>
</LinkedListItems>
next != container->head ? next : NULL