VisualStudio .natvis:我可以在CustomListItems中有一个自定义复杂项吗?

时间:2017-11-09 07:40:58

标签: visual-studio-2015 visual-studio-2017 natvis

在C ++中,我有一个我想要可视化的整数数组,这些元素是这样的:

[0] <range 1 start, e.g. 1253>
[1] <range 1 end, e.g. 1320>
[2] <range 2 start, e.g. 1852>
[3] <range 2 end, e.g. 2528>
...
[n] 0

所以,我想将它想象成具有自定义表示,其中每个可视化项目都像[0] <1253-1320>; [1] <1852-2528>等。

目前,我有这个(没有给我预期的结果):

<CustomListItems>
  <Variable Name='pCurRange' InitialValue='m_pWhichRanges'/>
  <Variable Name='i' InitialValue='0'/>
  <Loop Condition='*pCurRange'>
    <Item Name='[{i,d}] begin'>*pCurRange</Item>
    <Item Name='[{i,d}] end'>*(pCurRange+1)</Item>
    <Exec>pCurRange+=2</Exec>
    <Exec>++i</Exec>
  </Loop>
</CustomListItems>

但我希望每个项目都是这样的(用DisplayString语法):

<Item>{*pCurRange} - {*(pCurRange+1)}</Item>

由于item元素的内容不能是这个,我似乎无法做到这一点。此外,我没有看到在可视化工具中定义字符串(或字符数组)变量的方法,并在Item元素之前构造它 - 最重要的是,可视化工具没有可用的字符串修饰符intrinsics。并且在项目的Name属性中执行它不是一个选项,因为我需要在Value列中。

可以用某种方式完成吗?

编辑:this是实现所需视图所需内容的请求。

1 个答案:

答案 0 :(得分:2)

我认为natvis中没有直接的方法可以做到这一点。但是,为什么不更改代码以更好地适应数据结构呢?首先声明一个

struct Range {
    int begin;
    int end;
}

,然后让m_pWhichRanges指向Range而不是int(甚至最好将其指向std::vectorstd::array或{{ 1}})。如果无法做到这一点,请确保在代码中的任何地方都使用gsl::span,以便调试器可以看到该类型。例如添加

struct Range

到您的结构/类。

现在您拥有Range* as_ranges() { return reinterpret_cast<Range*>(m_pWhichRanges); } 类型,可以将Range显示为m_pWhichRanges的自定义列表,并让每个Range神奇地显示自己。

Range

请注意,我在<CustomListItems> <Variable Name='pCurRange' InitialValue='(Range*)m_pWhichRanges'/> <Variable Name='i' InitialValue='0'/> <Loop Condition='pCurRange->begin'> <Item Name='[{i,d}]'>pCurRange,na</Item> <Exec>++pCurRange</Exec> <Exec>++i</Exec> </Loop> </CustomListItems> 项目中添加了,na,以便不显示地址。

不需要这样做,但是如果您愿意,现在可以将范围显示微调为例如。

pCurRange