[英]Visual Studio 2012 Natvis skip IndexListItems
我正在為Qt類創建一個natvis文件,我遇到了一個問題。
為了可視化QHash對象,我創建了以下兩種類型:
<Type Name="QHashNode<*,*>">
<DisplayString Condition="next->next == 0">{{ key={key} value={value} h={h}}}</DisplayString>
<DisplayString>{{ key={key} value={value} h={h} withCollision }}</DisplayString>
<Expand>
<Item Name="NextNode">reinterpret_cast<QHashNode<$T1,$T2> *>(next)</Item>
</Expand>
</Type>
<Type Name="QHash<*,*>">
<DisplayString>{{ size={d->size} buckets={d->numBuckets} }}</DisplayString>
<Expand>
<IndexListItems>
<Size>d->numBuckets</Size>
<ValueNode Condition="reinterpret_cast<QHashNode<$T1,$T2> *>(d->buckets[$i]) != e">reinterpret_cast<QHashNode<$T1,$T2> *>(d->buckets[$i])</ValueNode>
</IndexListItems>
</Expand>
</Type>
它幾乎可以工作,但由於QHash在內存中不連續,因此存在大量無效條目。 條件
reinterpret_cast<QHashNode<
$T1,$T2> *>(d->buckets[$i]) != e
已經過濾掉那些無效的,但它們仍顯示為<Unable to display value>
。
有誰知道是否有辦法完全跳過這些條目?
我從來沒有真正使用過autoexp.dat文件,這是舊的方法,但是在查看安裝了Qt-plugin的文件時,我覺得這個聲明
#switch ($e.next != 0) #case 1 (
$e
)
確切地說,所以我希望有可能在natvis文件中做到這一點嗎?
如果有人感興趣,我可以給你natvis文件,但我到目前為止只有QString,QByteArray,QList,QVector,QMap和(有問題的)QHash。
根據寫入類型可視化器的MSDN頁面 , <IndexListItems>
根據定義是連續的:
IndexListItems擴展
ArrayItems假設數組元素在內存中連續排列。 調試器通過簡單地將其指針遞增到當前元素來獲取下一個元素。 要支持需要操作索引到值節點的情況,可以使用索引列表項。 這是一個使用'IndexListItems'節點的可視化器:[....] ArrayItems和IndexListItems之間唯一的區別是'ValueNode'需要帶有隱式'$ i'參數的第i個元素的完整表達式。
另外,我可以將您指向Qt Labs VSTools存儲庫 及其文檔嗎? 特別是tools/Qt4EEAddin/qt5.natvis
看起來很像我認為你想寫的東西? (或者它實際上是你在寫什么?^ _ ^)無論哪種方式,我認為你能做的最好的是qt5.natvis
,它有一個特殊的<DisplayString>
用於空的QHashNodes
但不會嘗試為空QHash
中的QHash
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.