自动在调试器中显示已知类型和长度的 void* (array)

Posted

技术标签:

【中文标题】自动在调试器中显示已知类型和长度的 void* (array)【英文标题】:Display void* (array) with known type and length in debugger automatically 【发布时间】:2016-08-27 07:30:10 【问题描述】:

假设类型T和长度size是已知的, 如何在调试器中优雅地显示数组data

template<class T>class Container
    void* data;  //<-- display it!
    int size;

在监视窗口(Visual Studio 2015)中,我可以通过键入以下内容显示container.data:-

static_cast<T*>(container.data),size    

问题:它们是否有任何技术(尤其是修改Container 中的代码)来使这个过程变得自动化和优雅——比如std::vector?

换句话说,如果我可以输入container,那就太好了,然后手表会显示:-

container
+data           (the + button, can click to expand)
--data[0]       (expanded)
--data[1]
......
--data[size-1]

我最好的线索是使用union,但我不确定。

【问题讨论】:

为什么不将data 声明为T* data; 我想避免使用默认构造函数,所以我使用placement new。 ***.com/a/4756306/3577745 @javaLover what 的默认构造函数? data是一个指针,不管是T*还是void*。默认构造与仅声明 T* data 有什么关系? (除了明显的默认构造指针)。 @WhozCraig 如果我这样做,那么我将不得不调用 ... T* data=new T[size] --> 调用默认构造函数......我误解了吗? (我是 C++ 新手) 您的用例有点奇怪,但不,它不像您误解的那样似乎。是的,new[T] 确实会调用默认构造。你可以通过 cast hijinx 避免这种情况,但这显然不是解决这个问题的地方,我最终希望你能跟踪已经构建和尚未构建的内容。至少我明白你想避免什么。 【参考方案1】:

VS2015 允许通过自定义.natvis 配置进行调试可视化定制。

在其他功能中,它支持模板类。 Type 元素的 Name 属性接受星号 * 作为可用于模板类名称的通配符。要在可视化条目中引用模板参数,您可以使用 $T1 宏。示例位于 VS2015 Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers 文件夹中。

【讨论】:

以上是关于自动在调试器中显示已知类型和长度的 void* (array)的主要内容,如果未能解决你的问题,请参考以下文章

void指针的转换

c/c++类型转换相关总结

void指针(void *的用法)

NSException 自动断点调试

输出所有希腊字符(char类型和int类型转换练习) 已知:开始字符 'α' 和 结束字符'ω'

在哪里可以了解 VS 调试器的“魔术名称”