【发布时间】:2016-05-24 12:52:37
【问题描述】:
问题
类似于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 调试器的目的。 非常感谢任何帮助。
【问题讨论】:
标签: visual-studio-debugging natvis