簡體   English   中英

Visual Studio 2012 Natvis跳過IndexListItems

[英]Visual Studio 2012 Natvis skip IndexListItems

我正在為Qt類創建一個natvis文件,我遇到了一個問題。

為了可視化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-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

在我看來,只是HTML標簽。

將其替換為'<','>'

更多信息,請看這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM