Visual Studio 2012 Natvis skip IndexListItems
Я создаю файл natvis для классов Qt, и я столкнулся с проблемой.
Чтобы визуализировать объекты QHash, я создал эти два типа:
<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>
Это в значительной степени работает, но поскольку QHash не является непрерывным в памяти, существует много недопустимых записей.
Условие
reinterpret_cast<QHashNode<
$T1,$T2> *>(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 до сих пор.
Ответы
Ответ 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