访问 Visual Studio ImageWatch 插件的 .natvis 文件中的矢量基础数据

Posted

技术标签:

【中文标题】访问 Visual Studio ImageWatch 插件的 .natvis 文件中的矢量基础数据【英文标题】:Access to vector underlying data in .natvis files for Visual Studio ImageWatch plugin 【发布时间】: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&lt;char&gt; 中。 我的 .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>

但下面这行我正在与&lt;Item Name="[data]"&gt;image_data&lt;/Item&gt; 斗争。图像数据分配不起作用,我无法在查看器中看到图像。相反,我收到“无效”消息。显然,这是因为image_datastd::vector&lt;char&gt; 而不是char*

我尝试过的

我在&lt;Item Name="[data]"&gt;image_data&lt;/Item&gt; 标记内尝试了许多不同的方法来访问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 调试器的目的。 非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

我找到了一个甚至“更好”的解决方案,而无需在结构中添加额外的指针:

<Item Name="[data]">&amp;image_data[0]</Item>

计算结果为代码:

&image_data[0]

实际上,这会返回向量的第一个元素的地址(并且向量内部使用一个数组,所以你基本上是在返回一个指向数组的指针)

【讨论】:

【参考方案2】:

显然,向量的数据可以通过以下方式分析:

<Item Name="[data]">image_data._Mypair._Myval2._Myfirst</Item>

我通过分析不同向量的 natvis 调试输出发现了这一点。

编辑:

我意识到,这是特定于实现的。上述解决方案在 VS2015 下运行良好。在VS 2012中,上面不起作用的解决方案

<Item Name="[data]">image_data._Myfirst</Item>

效果很好。

【讨论】:

以上是关于访问 Visual Studio ImageWatch 插件的 .natvis 文件中的矢量基础数据的主要内容,如果未能解决你的问题,请参考以下文章

文件无法访问 - Visual Studio 2017

Visual Studio 在 python 中显示错误“无法访问”

Visual Studio 2010 远程调试 - 无法连接:拒绝访问

从 Visual Studio 的监视窗口访问 javascript?

设置 Visual Studio IIS Express 站点局域网访问

在 Visual Studio 的即时窗口中访问“cmath”函数