简体   繁体   English

如何使我的 class 在 Visual Studio 中像 std::array 和 std::vector 一样调试友好?

[英]How can I make my class as debug friendly as std::array and std::vector in Visual Studio?

I want to make gsl::span to be as debug friendly as std::vector/std::array, in the Visual Studio debugging environment.我想让 gsl::span 在 Visual Studio 调试环境中像 std::vector/std::array 一样调试友好。

Here is what I mean.这就是我的意思。

Given this code鉴于此代码

    struct custom_class
    {
        custom_class(std::vector<int> & foo) : ptr(foo.data()), length(foo.size())
        {}

        int* ptr;
        size_t length;
    };



    void vector_example()
    {
        std::vector<int> vector_foo = { 0,1,3,4,5,6,3,2 };

        std::array<int, 8> array_foo = { 0,1,3,4,5,6,3,2 };

        gsl::span<int> span_foo(vector_foo);

        custom_class custom_class_foo(vector_foo);

        std::cout << "How can I make my class as debug friendly as std::array and std::vector?" << "\n";
    }

The debugger is able to visual std::vector/array like this:调试器能够像这样可视化 std::vector/array:

std::array标准::数组

-       array_foo   { size=8 }  std::array<int,8>
        [0] 0   int
        [1] 1   int
        [2] 3   int
        [3] 4   int
        [4] 5   int
        [5] 6   int
        [6] 3   int
        [7] 2   int
+       [Raw View]  {_Elems=0x000000654696f368 {0, 1, 3, 4, 5, 6, 3, 2} }   std::array<int,8>

std::vector标准::向量

-       vector_foo  { size=8 }  std::vector<int,std::allocator<int>>
        [capacity]  8   __int64
+       [allocator] allocator   std::_Compressed_pair<std::allocator<int>,std::_Vector_val<std::_Simple_types<int>>,1>
        [0] 0   int
        [1] 1   int
        [2] 3   int
        [3] 4   int
        [4] 5   int
        [5] 6   int
        [6] 3   int
        [7] 2   int
+       [Raw View]  {_Mypair=allocator }    std::vector<int,std::allocator<int>>

But when I look at std::span and my own custom class, I can't look past the first indice in the debugger但是当我查看 std::span 和我自己的自定义 class 时,我无法查看调试器中的第一个索引

Custom Class定制 Class

-       custom_class_foo    {ptr=0x0000015f50e3c340 {0} length=8 }  `anonymous-namespace'::custom_class
-       ptr 0x0000015f50e3c340 {0}  int *
            0   int
        length  8   unsigned __int64

gsl::span gsl::跨度

-       span_foo    {storage_={data_=0x000001f5bb2fdc20 {0} } } gsl::span<int,-1>
-       storage_    {data_=0x000001f5bb2fdc20 {0} } gsl::span<int,-1>::storage_type<gsl::details::extent_type<-1>>
-       gsl::details::extent_type<-1>   {size_=8 }  gsl::details::extent_type<-1>
        size_   8   __int64
-       data_   0x000001f5bb2fdc20 {0}  int *
            0   int

Visual Studio has extensibility points called Natvis Framework that allow adding custom visualizers for native types. Visual Studio 具有称为 Natvis 框架的扩展点,允许为本地类型添加自定义可视化工具。 Here's a tutorial on creating a custom view. 这是有关创建自定义视图的教程。

Turns out the Guideline Support Library already has native visualization support.结果是 Guideline Support Library 已经有了原生的可视化支持。

I didn't realize this since I just copied the include folder into my project, instead of properly adding it as a CMake project.我没有意识到这一点,因为我只是将包含文件夹复制到我的项目中,而不是正确地将其添加为 CMake 项目。

Cmake as of 3.7.x handles including *.natvis files.从 3.7.x 开始的 Cmake 句柄包括 *.natvis 文件。

I'm going to link to the gsl natvis for the guideline support library since it also provides a really good example for those looking to make their native visualizers.我将链接到 gsl natvis 以获取指南支持库,因为它还为那些希望制作原生可视化器的人提供了一个非常好的示例。

https://github.com/microsoft/GSL https://github.com/microsoft/GSL

https://github.com/microsoft/GSL/blob/master/GSL.natvis https://github.com/microsoft/GSL/blob/master/GSL.natvis

https://github.com/microsoft/GSL/blob/master/CMakeLists.txt https://github.com/microsoft/GSL/blob/master/CMakeLists.txt

Edit:编辑:

Just in case those links die I'm going to highlight the important bits.以防万一这些链接失效,我将强调重要的部分。 Mainly how to make a native visualization for 'array proxy classes'.主要是如何为“数组代理类”制作原生可视化。

And how to add it to your project in cmake.以及如何在 cmake 中将其添加到您的项目中。 (In this case GSL's CMakeList handles it for you if you include the project, so you don't have to write this for GSL. But if you have your own custom class this is useful for reference) (在这种情况下,如果您包含项目,GSL 的 CMakeList 会为您处理它,因此您不必为 GSL 编写此内容。但如果您有自己的自定义 class,这对参考很有用)

GSL.natvis GSL.natvis

<?xml version="1.0" encoding="utf-8"?>
<!-- 
    This will make GitHub and some editors recognize this code as XML: 
    vim: syntax=xml
-->
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

    <!-- other stuff that isn't gsl::span  ... -->

    <!-- These types are from the span header. -->
    <!-- This is for dynamic_extent spans. -->
    <Type Name="gsl::span&lt;*, -1&gt;">
        <DisplayString>{{ extent = {storage_.size_} }}</DisplayString>
        <Expand>
            <ArrayItems>
                <Size>storage_.size_</Size>
                <ValuePointer>storage_.data_</ValuePointer>
            </ArrayItems>
        </Expand>
    </Type>

    <!-- other stuff that isn't gsl::span ... -->
</AutoVisualizer>  

CMakeLists.txt CMakeLists.txt


if (CMAKE_VERSION VERSION_GREATER 3.7.8)
    if (MSVC_IDE)
        option(VS_ADD_NATIVE_VISUALIZERS "Configure project to use Visual Studio native visualizers" TRUE)
    else()
        set(VS_ADD_NATIVE_VISUALIZERS FALSE CACHE INTERNAL "Native visualizers are Visual Studio extension" FORCE)
    endif()

    # add natvis file to the library so it will automatically be loaded into Visual Studio
    if(VS_ADD_NATIVE_VISUALIZERS)
        target_sources(GSL INTERFACE
            ${CMAKE_CURRENT_SOURCE_DIR}/GSL.natvis
        )
    endif()
endif()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使 std::vector class 成为一个序列,以便可以将其传递给 boost::hana::group? - How can I make the std::vector class a Sequence so that it can be passed to boost::hana::group? 如何在c ++ 11中使用std :: vector使其更快? - How Can I make it faster in c++11 with std::vector? 如何制作 function 指针的 std::vector? - How can I make a std::vector of function pointers? 我可以使用std :: generate来获取std :: array的向量 <T, 2> ? - Can I use std::generate to get a vector of std::array<T, 2>? 为什么我可以创建 std::array 的向量? - Why can I create a vector of std::array? 当我在类中使用std :: vector作为字段时,如何在我的类中定义iterator和const_iterator? - How can I define iterator and const_iterator in my class while I uses std::vector as field in my class? 如何初始化std :: map项的std :: vector? - How can I initialize an std::vector of std::map items? 如何构建一个std :: vector <std :: string>然后对它们进行排序? - How can I build a std::vector<std::string> and then sort them? 我如何使用 std::vector 之类的东西<std::mutex> ? - How can I use something like std::vector<std::mutex>? 如何将 std::string 转换为 std::vector? - How can I convert a std::string to std::vector?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM