1

在 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 元素之前构造它的方法 - 最重要的是,可视化器没有可用的字符串修饰符内在函数。在项目的 Name 属性中执行此操作不是一个选项,因为我需要在 Value 列中使用它。

可以以某种方式完成吗?

编辑:是实现我想要的视图所需的请求。

4

1 回答 1

2

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

struct Range {
    int begin;
    int end;
}

然后让m_pWhichRanges指向 aRange而不是 an int(或者更好地使它成为 astd::vector或 astd::array或 a gsl::span)。如果这是不可能的,那么请确保您struct Range在代码中的任何位置使用,以便调试器看到该类型。例如添加

Range* as_ranges() { return reinterpret_cast<Range*>(m_pWhichRanges); }

到你的结构/类。

现在您有了Range可以显示m_pWhichRangesRanges 的自定义列表的类型,并让每个都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项目,以便不显示地址。

没有必要这样做,但如果你愿意,你现在可以微调范围的显示,例如。

<Type Name="Range">
  <DisplayString>&lt;{begin,d}, {end,d}&gt;</DisplayString>
</Type>
于 2018-11-11T17:37:00.690 回答