[英]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
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<*, -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 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.