問題
この質問と同様に、自分で定義した type にImageWatchMyImageClass
プラグインを使用しようとしています。ImageWatch は、コードのデバッグ中に画像をグラフィカル表現で表示できるようにする Visual Studio プラグインです。.natvis ファイルを記述して、カスタム定義クラスのサポートを追加できます。
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
}
ImageWatch プラグインはchar*
画像データのタイプを想定していますが、データをstd::vector<char>
. 私の .natvis ファイルは非常に単純です (完全を期すためにスキップできます)。
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1"
MenuName="Add to Image Watch"/>
<Type Name="MyImageClass">
<UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
</Type>
<Type Name="MyImageClass">
<Expand>
<Synthetic Name="[type]">
<DisplayString>UINT8</DisplayString>
</Synthetic>
<Item Name="[channels]">1</Item>
<Item Name="[width]">width</Item>
<Item Name="[height]">height</Item>
<Item Name="[planes]">1</Item>
<Item Name="[data]">image_data</Item>
<Item Name="[stride]">width</Item>
</Expand>
</Type>
</AutoVisualizer>
しかし、私が苦労している次の行<Item Name="[data]">image_data</Item>
。画像データの割り当てがうまくいかず、ビューアで画像が見えません。代わりに、「無効」というメッセージが表示されます。明らかに、これはimage_data
が astd::vector<char>
であり、 ではないためですchar*
。
私が試したこと
データ ポインター<Item Name="[data]">image_data</Item>
の基になるベクトルにアクセスするために、タグ内でさまざまなことを試しましたが、どれも機能しません。char*
image_data
image_data.data()
どうやら、.natvis ファイルで関数を呼び出すことはできません。Natvis 出力: エラー: このコンテキストでは副作用はサポートされていません。image_data._Myfirst
( ここの セクション「ArrayItems Expansion」と同様) Natvis 出力: エラー: バインドされた関数へのポインターは、関数を呼び出すためにのみ使用できます。
機能するが理想的なソリューションではない
回避策として、データが正しいかどうかを確認するchar*
ために、構造体に a を追加し、データの基礎となるベクトルを割り当てました。
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
char* image_data_ptr;
};
その後
image_data_ptr = image_data.data();
それに応じて .natvis ファイルが変更されます
<Item Name="[data]">image_data_ptr</Item>
これは機能し、ImageWatch で画像を確認できます。ただし、VS デバッガーの目的のためだけに、余分な変数を導入したくありません。どんな助けでも大歓迎です。