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<*,*>">
<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>
Het werkt vrijwel, maar aangezien de QHash niet continu in het geheugen aanwezig is, zijn er veel ongeldige invoer.
De voorwaarde
reinterpret_cast<QHashNode<
$T1,$T2> *>(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.natvis
lijkt 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.natvis
staat, dat een speciale <DisplayString>
voor lege QHashNodes
maar probeert geen lege buckets in de QHash
te verwijderen.
Antwoord 2
het lijkt mij, alleen html-tags.
vervang het door ‘<‘ , ‘>’
meer informatie, zie hier