49

Qtクラスのnatvisファイルを作成していますが、問題が発生しました。

QHashオブジェクトを視覚化するために、次の2つのタイプを作成しました。

<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しかありません。

4

2 に答える 2

2

タイプビジュアライザーの記述に関するMSDNページによると、定義<IndexListItems>により連続しています:

IndexListItems 拡張

ArrayItems は、配列要素がメモリ内で連続して配置されていることを前提としています。デバッガーは、現在の要素へのポインターをインクリメントするだけで、次の要素に到達します。値ノードへのインデックスを操作する必要がある場合をサポートするために、インデックス リスト アイテムを使用できます。[....] ArrayItems と IndexListItems の唯一の違いは、ValueNode が暗黙の '$i' パラメータを使用して i 番目の要素に完全な式を期待することです。

また、Qt Labs VSTools リポジトリそのドキュメントを教えていただけますか? 特にtools/Qt4EEAddin/qt5.natvis、あなたが書こうとしていると私が思うものに非常によく似ていますか? (それとも実際にあなたが書いているものですか? ^_^) いずれにせよ、あなたができる最善のことは、空のためqt5.natvisの特別なものを持っていますが、.<DisplayString>QHashNodesQHash

于 2013-09-24T03:25:00.243 に答える
0

私には、htmlタグだけのようです。

「<」、「>」に置き換えます

詳細については、こちらを参照してください

于 2013-09-19T06:15:15.457 に答える