在 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 c++ 仅在调试模式下 LNK 1104 错误
为啥 Visual Studio 不能在“不调试就启动”模式下打开文件?
OpenGL 程序仅在 Visual Studio 2013 中的调试模式下工作