49 votes

Visual Studio 2012 Natvis skip IndexListItems

Je suis en train de créer un fichier natvis pour les classes Qt et j'ai rencontré un problème.

Afin de visualiser les objets QHash, j'ai créé ces deux types :

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

Cela fonctionne à peu près, mais comme le QHash n'est pas continu en mémoire, il y a beaucoup d'entrées invalides. La condition

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

filtre déjà ceux qui ne sont pas valides, mais ils sont toujours affichés en tant que <Unable to display value> .

Quelqu'un sait-il s'il existe un moyen d'ignorer complètement ces entrées ?

Je n'ai jamais vraiment travaillé avec le fichier autoexp.dat qui était l'ancienne façon de faire, mais en regardant le fichier avec le Qt-plugin installé, il me semble que l'instruction

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

fait exactement cela, donc j'espère qu'il y a peut-être un moyen de le faire dans le fichier natvis également ?

Si quelqu'un est intéressé, je peux vous donner le fichier natvis, mais je n'ai que QString, QByteArray, QList, QVector, QMap et (le problématique) QHash jusqu'à présent.

2voto

bks Points 1136

Según el Page MSDN sur l'écriture de visualisateurs de type , <IndexListItems> sont par définition contigus :

Expansion de IndexListItems

ArrayItems suppose que les éléments du tableau sont disposés de manière contiguë dans la mémoire. Le débogueur accède à l'élément suivant en incrémentant simplement son pointeur sur l'élément actuel. Pour prendre en charge les cas où vous devez manipuler l'index du nœud de valeur, des éléments de liste d'index peuvent être utilisés. Voici un visualiseur utilisant le noeud 'IndexListItems' : [....] La seule différence entre ArrayItems et IndexListItems est que le 'ValueNode' attend l'expression complète du ième élément avec le paramètre implicite '$i'.

Aussi, puis-je vous indiquer le dépôt VSTools de Qt Labs y sa documentation ? En particulier tools/Qt4EEAddin/qt5.natvis ressemble beaucoup à ce que je pense que vous essayez d'écrire ? (Ou est-ce en fait ce que vous écrivez ? ^_^) Quoi qu'il en soit, je pense que le mieux que tu puisses faire est ce qui se trouve dans qt5.natvis qui a un caractère spécial <DisplayString> pour le vide QHashNodes mais n'essaye pas d'éluder les seaux vides dans les QHash .

0voto

plan9assembler Points 2209

Il me semble, juste des balises html.

remplacez-les par '<' , '>'.

Pour plus d'informations, voir aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X