我想爲雙鏈表編寫一個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