首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用natvis扩展ArrayItems/IndexListItems的显示范围

使用natvis扩展ArrayItems/IndexListItems的显示范围
EN

Stack Overflow用户
提问于 2022-05-24 08:10:13
回答 3查看 205关注 0票数 1

我正在尝试使用纳维斯来可视化内存内容,它是由指针指向的。我还试图将内存声明为向量。但是每次我面临的问题是,在调试过程中,可视化工具只能显示第一个50 entry

我在这里举一个极小的例子。假设pointer_arrayFoo类的成员。在驱动程序文件中,创建一个大小为5000的array,它由数组指向。我想用变量pointer_array观察数组的值。此外,我还试图了解natvis是如何与std::vector反应的,这就是为什么作为成员变量的向量(foo_vec)也会被声明。

foo.h:

代码语言:javascript
复制
#include <iostream>
#include <vector>

class Foo
{
    public:
        Foo(){}

        uint32_t *pointer_array;
        std::vector<uint32_t> foo_vec;
};

main.cpp:

代码语言:javascript
复制
#include "foo.h"
# define ARRAY_SIZE 5000

int main()
{
    Foo obj_1;

    uint32_t foo_array[ARRAY_SIZE];
    for(int i = 0; i < ARRAY_SIZE; i++)
    {
        foo_array[i] = i*2;
    }
    obj_1.pointer_array = foo_array;

    for(uint32_t i = 0; i < ARRAY_SIZE; i++)
    {
        obj_1.foo_vec.push_back(i*3);
    }

    return 0;
}

下面是我使用过的natvis file

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
    <Type Name="Foo">
        <DisplayString>Testing_Natvis</DisplayString>
        <Expand>
        <ArrayItems>
            <Size>5000</Size>
            <ValuePointer>pointer_array</ValuePointer>
        </ArrayItems>

        <!-- Tested with IndexListItems but failed to fetch all data, still only first 49 entry -->
        <!-- <IndexListItems>
          <Size>5000</Size>
          <ValueNode>pointer_array[$i]</ValueNode>
        </IndexListItems> -->

          <!-- Same result as like as pointer_array. Only first 49 entry is appeared -->
          <!-- <IndexListItems>
            <Size>foo_vec.size()</Size>
            <ValueNode>foo_vec[$i]</ValueNode>
          </IndexListItems> -->

          <!-- <ArrayItems>
            <Size>foo_vec.size()</Size>
            <ValuePointer>&amp;foo_vec[0]</ValuePointer>
        </ArrayItems> -->
        </Expand>
    </Type>
</AutoVisualizer>

launch.json中,我只添加了以下两行:

代码语言:javascript
复制
"visualizerFile": "${workspaceFolder}/natvis_file/file.natvis",
"showDisplayString": true,

为了更好地理解,我在这里给出了输出的截图,在natvis文件中,我使用了IndexListItems,并给出了大小80来查看索引0到79之间的值,但显示的最后一个值来自索引49。

下面显示的是,我给出了size值6,并且natvis完美地显示了从索引0到5的值。

有什么办法可以用Natvis实现所有内存的输入吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-31 08:09:46

  • 根据这个发布,虽然使用ArrayItems节点显示超过1000个值仍然存在缺陷,但问题还是得到了解决。请参阅本期获取更多信息。
  • 如果使用IndexListItems,则此显示范围限制将消失。下面的片段可用于查看1000多个元素
代码语言:javascript
复制
<IndexListItems>
   <Size>5000</Size>
   <ValueNode>pointer_array[$i]</ValueNode>
</IndexListItems> 
票数 0
EN

Stack Overflow用户

发布于 2022-05-31 10:55:10

根据关于github的这一期的说法,对50的限制是“按设计”的,并且没有改变它的意图。

票数 0
EN

Stack Overflow用户

发布于 2022-05-31 11:29:27

我查看了代码的这个限制。因此,我可以给出一个解决方案--您可以展示容器的一部分。

代码语言:javascript
复制
<IndexListItems>
  <Size>foo_vec.size()</Size>
  <ValueNode>foo_vec[$i]</ValueNode>
</IndexListItems>
<IndexListItems>
  <Size>foo_vec.size()-50</Size>
  <ValueNode>foo_vec[$i+50]</ValueNode>
</IndexListItems>
...
<IndexListItems>
  <Size>foo_vec.size()-4950</Size>
  <ValueNode>foo_vec[$i+4950]</ValueNode>
</IndexListItems>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72359355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档