2012-12-06 33 views
49

我正在爲Qt類創建一個natvis文件,並且遇到了問題。Visual Studio 2012 Natvis skip IndexListItems

爲了形象化QHash對象我創建這兩種類型:

<Type Name="QHashNode&lt;*,*&gt;"> 
    <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&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(next)</Item> 
    </Expand> 
</Type> 

<Type Name="QHash&lt;*,*&gt;"> 
    <DisplayString>{{ size={d->size} buckets={d->numBuckets} }}</DisplayString> 
    <Expand> 
     <IndexListItems> 
      <Size>d->numBuckets</Size> 
      <ValueNode Condition="reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(d->buckets[$i]) != e">reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(d->buckets[$i])</ValueNode> 
     </IndexListItems> 
    </Expand> 
</Type> 

它幾乎工程,但由於QHash不在內存中連續,也有很多無效的條目。 條件

reinterpret_cast&lt;QHashNode&lt; 
$T1,$T2&gt; *&gt;(d->buckets[$i]) != e 

已經篩選出那些是無效的,但他們仍然顯示爲<Unable to display value>

有誰知道是否有辦法完全跳過這些條目?

我從來沒有真正與這是舊的方式來做到這一點autoexp.dat文件的工作,但看着與Qt的插件文件時,安裝在我看來,這種說法

#switch ($e.next != 0) #case 1 (
    $e 
) 

做確切地說,所以我希望有一種方法可以在natvis文件中做到這一點?

如果有人有興趣,我可以給你natvis文件,但是我現在只有QString,QByteArray,QList,QVector,QMap和(有問題的)QHash。

+0

我有我的散列容器完全相同的問題。我還發現我投了這個功能請求:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3712689-implement-the-features-missing-in-natvis-that-auto – JCash

+0

! = e需要有一個.gt作爲* – cmd

+0

檢查[此鏈接](http://blogs.msdn。COM/B/vcblog /存檔/ 2013/06/28 /使用視覺工作室2013到寫維護本地-可視化-natvis.aspx)。可能會幫助你... –

回答

0

在我看來,只是HTML標籤。

與 '<', '>'

更多信息替換它,見here

2

按照MSDN page on writing type visualizers<IndexListItems>是由定義連續:

IndexListItems擴展

ArrayItems假定數組元素被佈置爲conti在記憶中有目共睹。調試器通過簡單地增加指向當前元素的指針來獲取下一個元素。爲了支持需要處理值節點索引的情況,可以使用索引列表項。這裏有一個使用'IndexListItems'節點的可視化工具:[....] ArrayItems和IndexListItems唯一的區別在於'ValueNode'需要隱式的'$ i'參數對iith元素的完整表達式。

另外,我可以指您the Qt Labs VSTools repositoryits documentation?特別是tools/Qt4EEAddin/qt5.natvis看起來很像我認爲你想寫的東西? (或者是實際上你在寫什麼?^ _ ^)無論哪種方式,我認爲你能做的最好的是qt5.natvis,它有一個特殊的<DisplayString>爲空的QHashNodes,但不試圖去掉空桶QHash

+0

這個回答/陳述是非常不正確的。該文檔說「連續佈置在內存中」,而不是連續佈局。 IndexListItems作爲使用索引的方式提供,而ArrayItems則不提供。我正在評論,以便其他人在搜索natvis幫助時不會被誤導。 – KymikoLoco