如何在Visual Studio中使类std :: array和std :: vector调试友好?

时间:2019-11-04 20:28:45

标签: c++ arrays c++11 vector visual-studio-debugging

我想在Visual Studio调试环境中使gsl :: span像std :: vector / std :: array一样易于调试。

这是我的意思。

给出此代码

    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";
    }

调试器能够像这样可视化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>>

但是当我查看std :: span和我自己的自定义类时,我看不到调试器中的第一个索引

自定义类

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

gsl :: span

-       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

1 个答案:

答案 0 :(得分:1)

结果证明,指南支持库已经具有本地可视化支持。

我没有意识到这一点,因为我只是将include文件夹复制到了我的项目中,而不是正确地将其添加为CMake项目。

从3.7.x开始的Cmake句柄,包括* .natvis文件。

我将链接至指南支持库的gsl natvis,因为它也为希望制作其本地可视化器的人提供了一个很好的例子。

https://github.com/microsoft/GSL

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

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

编辑:

以防万一这些链接消失了,我将重点介绍重要的部分。 主要是如何对“数组代理类”进行本机可视化。

以及如何在cmake中将其添加到您的项目中。 (在这种情况下,如果您包含项目,则GSL的CMakeList会为您处理它,因此您不必为GSL编写它。但是,如果您有自己的自定义类,这对参考很有用)

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


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()