Подтвердить что ты не робот

Visual Studio 2012 Natvis skip IndexListItems

Я создаю файл natvis для классов Qt, и я столкнулся с проблемой.

Чтобы визуализировать объекты 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 до сих пор.

4b9b3361

Ответ 1

В соответствии с страницами MSDN при визуализации типов шрифтов <IndexListItems> по определению являются смежными:

Расширение IndexListItems

ArrayItems предполагают, что элементы массива расположены последовательно в памяти. Отладчик переходит к следующему элементу, просто увеличивая указатель на текущий элемент. Чтобы поддерживать случаи, когда вам нужно манипулировать индексом со значением node, можно использовать элементы списка индексов. Heres визуализатор с использованием "IndexListItems" node: [....] Единственное различие между ArrayItems и IndexListItems заключается в том, что "ValueNode" ожидает полного выражения для i-го элемента с неявным параметром "$ i".

Кроме того, могу ли я указать вам на хранилище Qt Labs VSTools и его документации? В частности, tools/Qt4EEAddin/qt5.natvis очень похож на то, что я думаю, что вы пытаетесь написать? (Или это на самом деле то, что вы пишете? ^ _ ^) В любом случае, я думаю, что лучшее, что вы можете сделать, это то, что находится в qt5.natvis, у которого есть специальный <DisplayString> для пустого QHashNodes, но он не пытается elide пустые ведра в QHash.

Ответ 2

мне кажется, просто html-теги.

замените его на '<', ' > '

дополнительную информацию см. here