The problem
Similar to this question, I am trying to use the ImageWatch plugin for my own defined type MyImageClass
. ImageWatch is a Visual Studio Plugin that allows you to view Images in a graphical representation while debugging code. You can write .natvis files to add support for custom defined classes.
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
}
The ImageWatch plugin expects a char*
type for the image data, however I am storing my data in a std::vector<char>
.
My .natvis file, is quite simple, (you can skip it, only for completeness)
<?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>
But the following line I am struggeling with <Item Name="[data]">image_data</Item>
. The image data assignment does not work, I cannot see the image in the viewer. Instead I get the message "invalid". Clearly, this is because image_data
is a std::vector<char>
and not char*
.
What I have tried
I have tried many different things inside the <Item Name="[data]">image_data</Item>
tag to access the vectors underlying char*
data pointer, but none work:
image_data
image_data.data()
Apparently no functions may be called in .natvis Files, Natvis output: Error: Side effects are not supported in this context.image_data._Myfirst
(Similar to here Section "ArrayItems Expansion") Natvis output: Error: a pointer to a bound function may only be used to call the function
What works, but isn't the ideal solution
As a workaround and to see if my data is correct I have added a char*
to the struct and then assign it the vectors underlying data.
struct MyImageClass
{
uint32_t width;
uint32_t height;
std::vector<char> image_data;
char* image_data_ptr;
};
and then
image_data_ptr = image_data.data();
The .natvis file is changed accordingly
<Item Name="[data]">image_data_ptr</Item>
This works, and I can see the image in ImageWatch. However, I would hate to introduce an extra variable, only for the purpose of the VS debugger. Any help is highly appreciated.