与this问题类似,我正在尝试将ImageWatch插件用于我自己定义的类型MyImageClass
。 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
是std::vector<char>
而不是char*
。
我在<Item Name="[data]">image_data</Item>
标签内尝试了许多不同的东西来访问char*
数据指针底层的向量,但没有一个工作:
image_data
image_data.data()
显然没有函数可以调用.natvis文件,Natvis输出:错误:在此上下文中不支持副作用。image_data._Myfirst
(类似于here节“ArrayItems扩展”)Natvis输出:错误:指向绑定函数的指针只能用于调用函数作为一种解决方法,看看我的数据是否正确,我已经在结构中添加了char*
,然后为其分配了基础数据的向量。
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调试器的目的。任何帮助都非常感谢。
我发现了一个更好的“更好”的解决方案,而不需要在结构中添加额外的指针:
<Item Name="[data]">&image_data[0]</Item>
哪个评估代码:
&image_data[0]
实际上,这会返回向量的第一个元素的地址(并且向量内部使用一个数组,所以你基本上返回一个指向数组的指针)
显然,矢量数据可以通过以下方式进行分析:
<Item Name="[data]">image_data._Mypair._Myval2._Myfirst</Item>
我通过分析不同向量的natvis调试输出找到了这一点。
我意识到,这是特定于实现的。上述解决方案在VS2015下运行良好。在VS 2012中,解决方案没有在上面工作
<Item Name="[data]">image_data._Myfirst</Item>
效果很好。