代码之家  ›  专栏  ›  技术社区  ›  suszterpatt

VisualStudio调试模式下的“STL”容器的“浅”显示?

  •  2
  • suszterpatt  · 技术社区  · 16 年前

    我在调试C++类时碰到了一堵墙。这是一个类似这样的图表:

    class Graph {
        class Node {
            std::map<int, Node>::iterator _neighbors[4];
        };
        std::map<int, Node> _map;
    };
    

    基本上,每个节点通过将迭代器存储在包含类的映射中来精确地跟踪4个邻居。

    问题是,在调试期间,当我在vs2008中显示映射的内容时,会得到如下结果:

    - _map
      - [0]
          first
        - second
          - _neighbors
            - _ptr
                first
              - second
                - _neighbors
                  - _ptr
                      first
                    - second
                      - _neighbors
                      ...
    

    显然,它没有在映射中列出索引为0的节点的4个邻居,而是列出了它的第一个邻居,然后是第一个邻居的第一个邻居,然后是第一个邻居的第一个邻居,等等。而且,在任何情况下 _neighbors 显示为数组,即使它是这样声明的。

    我找到一个名为 VSEDebug 据称,它已经增强了STL显示,但它是针对VS2K3,而我不能让它在2K8中工作(既不是二进制文件,也不是自己编译)。

    即时窗口也没有多大帮助,因为试图打电话 _map.operator[] 回报 CXX0058: Error: overloaded operator not found .

    有什么想法,我可以得到一个有意义的内容显示我的地图?请注意,作为一个整体,我对vs还比较陌生,所以可能需要详细的说明。:)

    2 回复  |  直到 16 年前
        1
  •  2
  •   dudewat    16 年前

    您可以在其中键入符号的名称。 命令窗口-立即 窗口并开始跟踪其成员指针。例如,如果调试一个名为STD:: V 要访问位于位置2的元素,请键入

    *(五、我的第一次+2)

    当然,成员myfirst取决于实现。但我想你明白了。(visual studio有一些问题,因为运算符的resolvindo重载)

        2
  •  1
  •   Ron Warholic    16 年前

    如果您愿意,您可以尝试编写自定义可视化工具,但是,您可能会复制已经存在的一些功能。以下是一篇介绍基本知识的文章:

    http://www.virtualdub.org/blog/pivot/entry.php?id=120

    如果你只想查看所有的数组元素,你可以在“快速监视”窗口中键入“γMAP(0),第二,邻居,4”,将其看作是四的数组,但这不是世界上最快的东西。