我想在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
答案 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<*, -1>">
<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()