Visual Studio 2012 Natvis IndexListItems overslaan

Ik ben een natvis-bestand aan het maken voor de Qt-klassen en ik ben tegen een probleem aangelopen.

Om QHash-objecten te visualiseren heb ik deze twee typen gemaakt:

<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>

Het werkt vrijwel, maar aangezien de QHash niet continu in het geheugen aanwezig is, zijn er veel ongeldige invoer.
De voorwaarde

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

filtert de ongeldige al uit, maar ze worden nog steeds weergegeven als <Unable to display value>.

Weet iemand of er een manier is om deze items volledig over te slaan?

Ik heb nooit echt met het autoexp.dat-bestand gewerkt, wat de oude manier was om het te doen, maar als ik naar het bestand kijk met de Qt-plug-in geïnstalleerd, lijkt het me dat de verklaring

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

doet precies dat, dus ik hoop dat er misschien een manier is om het ook in het natvis-bestand te doen?

Als iemand geïnteresseerd is, kan ik je het natvis-bestand geven, maar ik heb tot nu toe alleen QString, QByteArray, QList, QVector, QMap en (de problematische) QHash.


Antwoord 1, autoriteit 100%

Volgens de MSDN-pagina over het schrijven van type visualizers, <IndexListItems>zijn per definitie aaneengesloten:

IndexListItems-uitbreiding

ArrayItems gaan ervan uit dat array-elementen aaneengesloten in het geheugen zijn ingedeeld. Debugger gaat naar het volgende element door simpelweg de aanwijzer naar het huidige element te verhogen. Om gevallen te ondersteunen waarin u de index naar het waardeknooppunt moet manipuleren, kunnen indexlijstitems worden gebruikt. Hier is een visualizer die het knooppunt ‘IndexListItems’ gebruikt: [….] Het enige verschil tussen ArrayItems en IndexListItems is dat de ‘ValueNode’ de volledige expressie verwacht voor het ith-element met de impliciete parameter ‘$i’.

Mag ik u ook wijzen op de Qt Labs VSTools-repositoryen de documentatie? Vooral tools/Qt4EEAddin/qt5.natvislijkt veel op wat ik denk dat je probeert te schrijven? (Of is het eigenlijkwat je schrijft? ^_^) Hoe dan ook, ik denk dat je het beste kunt doen wat er in qt5.natvisstaat, dat een speciale <DisplayString>voor lege QHashNodesmaar probeert geen lege buckets in de QHashte verwijderen.


Antwoord 2

het lijkt mij, alleen html-tags.

vervang het door ‘<‘ , ‘>’

meer informatie, zie hier

Other episodes