在 Visual Studio 2019 C++ 中,如何扩展动态分配的数组以显示其所有元素?

Posted

技术标签:

【中文标题】在 Visual Studio 2019 C++ 中,如何扩展动态分配的数组以显示其所有元素?【英文标题】:In Visual Studio 2019 C++, how can I expand a dynamically allocated array so that all of its elements are displayed? 【发布时间】:2020-04-09 08:39:46 【问题描述】:

我为向量类编写了一个简单(可能很糟糕)的实现,类似于 std::vector。

这是课程:

template <class T>
class Vector

    T* data;
    int size;
public:
    Vector(int = 0);
    ~Vector();

    Vector(const Vector<T>&);
    
    Vector<T>& operator=(Vector<T>);
    T& operator[](int);

    friend void swap(Vector<T>&, Vector<T>&);

    void Clear();
    void Insert(T, int);
    void Delete(int);
    int Size();
;

在调试使用我的向量的代码时,我注意到我在内部使用的指针通常只能扩展到第一个元素。

我发现了这个 SO 问题,How to display a dynamically allocated array in the Visual Studio debugger?,它似乎为问题提供了一个简单的解决方案,但我想知道是否可以将数组扩展一个非常量(例如,当前向量大小) .

考虑到 std::vector 确实在调试器中正常显示其所有元素,我是否可以重写我的向量以包含该功能?

这是带有一些测试变量的“Locals”选项卡的片段,以显示我所指的内容:

【问题讨论】:

欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后请学习如何创建一个minimal reproducible example 和edit 你的问题来展示它。 @Someprogrammerdude 我认为这不适用于这里。问题不在于调试代码。这是关于在调试器中自定义漂亮的打印,我认为问题已经足够清楚地说明了。 我想知道这是否可以通过 Client Block Hook Function 向 VC 调试器报告信息来完成 - 但我看到的所有示例都只是将信息写入标准输出 - 我想你可能不得不使用 COM (EnvDTE 等)在您的 _CrtSetDumpClient 回调中 - 但这会增加代码的复杂性。 FWIW 我找不到任何有关用于指定调试器行为的自定义 __declspec 属性的任何信息(与 .NET Framework 的 [DebuggerDisplayAttribute] 不同)。这是一种耻辱——而且相当令人惊讶。 (公平地说,您可以在 C++ 代码中使用 DebuggerDisplay,但只能使用 C++/CLI - 这不是“真正的”C++...) 【参考方案1】:

我似乎找到了使用 .natvis 文件的方法。

本文提供了有关 Natvis 文件的更多详细信息: https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2019

向您的项目添加 .natvis 文件允许您指定容器在 Locals 中的显示方式。

这是原帖中描述的 Vector 容器的简单示例:

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="AC::Vector&lt;*&gt;">
    <DisplayString> size=size </DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">size</Item>
      <ArrayItems>
        <Size>size</Size>
        <ValuePointer>data</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>

</AutoVisualizer>

创建文件并启动调试会话后,容器现在可以正确显示其内容:

AC::Vector<int> myVec(3);
myVec[0] = 1;
myVec[1] = 2;
myVec[2] = 3;

当地人:

【讨论】:

以上是关于在 Visual Studio 2019 C++ 中,如何扩展动态分配的数组以显示其所有元素?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 项目在 Visual Studio 2019 中触发了断点

使用 C++ 在 Visual Studio 2019 中创建新的头文件?

如何在 Visual Studio 2019 中有条件地编译 c++ 源文件?

如何使用 Visual Studio 2019 和 c++ 链接 OpenSSL 库?

如何在 Visual Studio 2019 C++ 中创建非虚拟文件夹

visual studio 2019中C++安装opencv