【问题标题】:Natvis visualizer to view member pointer type as arrayNatvis 可视化器将成员指针类型视为数组
【发布时间】:2019-11-24 05:20:50
【问题描述】:

在 Visual Studio 2015 观察窗口中,可以通过添加逗号和数组长度来将指针视为数组,例如d,10 将为双 * d 显示 10 个元素。

是否可以创建一个基于间接次数的 Natvis 类型条目,即。对于 d、d* 和 d** 以不同的方式? 通常这些甚至是一种类型的成员,例如struct s { double* d },但我想避免为所有这些类型编写自定义可视化工具。

该问题已标记为 VS2015,但如果有任何针对 vs2017 或 vs2019 的解决方案,欢迎使用。

编辑1: 这是我正在寻找的一个简单示例:

struct S
{
    double* v3;  
    double** m3;
};
int main()
{
    double* pv3 = new double[3]{ -1,-2,-3 };
    double** ppm3 = new double*[3]{ new double[3]{ 1,2,3 }, new double[3]{ 4,5,6 }, new double[3]{ 7,8,9 } };

    S s;
    s.v3 = pv3;
    s.m3 = ppm3;

    double v3[3] = { -1,-2,-3 };
    double m33[3][3] = { { 1,2,3 }, { 4,5,6 }, { 7,8,9 } };
}
  • pv3 和 s.v3 应该像 v3 和
  • 一样可视化
  • ppm3 和 s.m3 应该像 m33 一样可视化

我知道将 每个 双指针视为双 [3] 可能不是每个人都想要的,但在某些代码库中,比如我正在处理的代码库中,这是 99% 的用例。

【问题讨论】:

  • 您能否给出一个简短的代码 sn-p,您想要一个可视化工具(因此请给出变量、它们的类型以及您希望它如何显示)!?

标签: arrays pointers visual-studio-2015 natvis


【解决方案1】:

很抱歉,您似乎无法轻松实现您想要的目标。

<Type Name="double*"><Type Name="double**"> 添加到 Natvis Visual Studio 时会报错

Natvis:NatvisFile.natvis(xx,x):错误:原始类型“double**”不允许使用

因此,无需更改代码,您就需要为所有相关结构添加 natvis。

但是看看你的代码库,我想给你指出CppCoreGuidelines,尤其是这些规则:

如果您的代码库遵循这些规则并且不执行数组到指针的衰减,那么调试器中将提供完整的类型信息。

另一种方法可能是将double 封装在强类型中。请在 Fluent{C++} 上比较 this blog post。但这可能只有在您没有需要 double*double** 的旧版 API 时才能轻松工作。

【讨论】:

  • 这都是很好的建议,我正在努力,但正如你在最后一行所说的,它确实是一个 30 多年的大型代码库,需要时间来适应新世界。我只是希望 MS 可能意识到这样的困难,因为它似乎是旧代码库中的常见情况,并提供了一些后门,即使它很难被访问。
【解决方案2】:

正如您在示例中注意到的,您有一个结构 S,因此您可以为此类型创建 natvis

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="S">
    <Expand>
      <Item Name="v3">v3, [3]nag</Item>
      <CustomListItems>
        <Variable Name="i" InitialValue="0"/>
        <Loop>
          <Item Name="m3[{i}]">m3[i],[3]nag</Item>
          <Exec>++i</Exec>
          <If Condition="i&gt;=3">
            <Break/>
          </If> 
        </Loop>
      </CustomListItems>
    </Expand>
  </Type>
</AutoVisualizer>

您的示例的结果:

但是,正如@Werner Henze 已经回答的那样,您不能为double 创建natvis

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多