在 Visual Studio 调试模式下“浅”显示 STL 容器?

Posted

技术标签:

【中文标题】在 Visual Studio 调试模式下“浅”显示 STL 容器?【英文标题】:"Shallow" display of STL containers in Visual Studio debug mode? 【发布时间】:2009-09-03 10:49:30 【问题描述】:

我在调试 C++ 类时碰壁了。这是一个图表,类似于:

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

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

问题是当我在调试过程中去显示VS2008中_map的内容时,我得到了这样的东西:

- _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 相当陌生,所以我可能需要详细说明。 :)

【问题讨论】:

可能重复:***.com/questions/104959/… VS 2008 对我来说显示地图非常好。 【参考方案1】:

您可以在命令窗口 - 立即 窗口中键入符号的名称并开始跟随其成员指针。例如,如果您调试名为 v 的 std::vector 并希望访问其位置 2 处的元素,请键入

*(v._Myfirst + 2)

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

【讨论】:

CXX0017: Error: symbol "_Myfirst" not found。尝试四处寻找类似的东西,但地图的所有 VS 显示都是它包含的元素。如何确定在我的实现中调用了 _Myfirst 什么?是否保证存在? 数据结构中必须有一个内部成员实际指向该元素。如果您的地图名为 m,请首先在命令窗口中键入 m【参考方案2】:

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

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

如果您只想查看所有数组元素,您可以在快速查看窗口中键入“_map[0].second._neighbors,4”以将其查看为四个数组,但这并不是最快的世间万物。

【讨论】:

_map[0] 返回 CXX0058: Error: overloaded operator not found。 dudewat 关于 VS 和操作符的说明似乎很合适 您也可以尝试“_map.find(0).second._neighbors,4”,尽管这也不能保证有效(特别是如果该键不存在任何元素)。

以上是关于在 Visual Studio 调试模式下“浅”显示 STL 容器?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 在调试模式下禁用 TRACE

Visual Studio c++ 仅在调试模式下 LNK 1104 错误

为啥 Visual Studio 不能在“不调试就启动”模式下打开文件?

OpenGL 程序仅在 Visual Studio 2013 中的调试模式下工作

带有 javascript 调试的 Visual Studio 在直接运行和在调试模式下运行时显示不同的行为

如何在调试模式下在 MS Visual Studio 中显示零件表达式的值?