【问题标题】:VisualStudio .natvis: can I have a custom complex item in CustomListItems?VisualStudio .natvis:我可以在 CustomListItems 中有一个自定义复杂项吗?
【发布时间】:2017-11-09 07:40:58
【问题描述】:

在 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] &lt;1253-1320&gt;[1] &lt;1852-2528&gt;

目前,我有这个(没有给我想要的结果):

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

可以通过某种方式完成吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    struct Range {
        int begin;
        int end;
    }
    

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

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

    到你的结构/类。

    现在您有了Range 类型,您可以将m_pWhichRanges 显示为Ranges 的自定义列表,并让每个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>
    

    请注意,我在pCurRange 项中添加了,na,以便不显示地址。

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

    <Type Name="Range">
      <DisplayString>&lt;{begin,d}, {end,d}&gt;</DisplayString>
    </Type>
    

    【讨论】:

    • > 但是您为什么不更改您的 代码以更好地适应数据结构呢? 1. 因为不是所有的代码都是我的。 2. 因为不是每个结构都适合所有需求 ;-)
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多