自动在调试器中显示已知类型和长度的 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)的主要内容,如果未能解决你的问题,请参考以下文章