VS2005 中损坏的 std::map 可视化器
Posted
技术标签:
【中文标题】VS2005 中损坏的 std::map 可视化器【英文标题】:Broken std::map visualiser in VS2005 【发布时间】:2009-07-09 05:40:48 【问题描述】:我正在使用英特尔编译器和 Visual Studio,但我似乎无法调试地图中的值。我得到一个快速预览,它显示了地图的大小,但元素只显示为“(错误)”,我将用一个简单的例子来说明,我已经生成了一个带有单个条目 myMapVariable[6]=1 的地图;
如果我将鼠标悬停在上面,我会得到这个“myMapVariable 1” 在监视窗口中,我得到了同样的结果,并且在加号上展开会给出一个子条目,其中显示 name = "(error)" 和 value = 0 (这是错误的)。
我在我的 autoexp.dat 调试文件中添加了一行,它显示了名为 [raw members] 的子项下的原始成员变量。我几乎已经达到了在没有帮助的情况下进一步深入研究的能力的极限,所以我想问这里是否有人可以提供一些见解。
【问题讨论】:
【参考方案1】:您很可能正在使用激进的优化设置。至少你的截图是典型的那种事情。在这种情况下,调试器会主动将热值填充到寄存器中,并且可能在您停止时,正确可视化整个映射所需的值已经被丢弃并被其他足够的东西覆盖(例如,指向当前节点的指针)。我可以想象,以高质量优化而闻名的英特尔 C++ 比 VC++ 更经常做这种事情(但我也经常看到后者这样做)。
考虑在调试配置中重新编译项目(这会禁用优化器),看看是否有帮助。
【讨论】:
Pavel,感谢您的反馈 - 我实际上是在带有 /Od 标志的调试模式下运行它(优化已禁用)。我可能会用直接的 MSVC 编译器试试这个,看看是否有什么不同。看看这是否与英特尔编译器如何处理 std::map 有关【参考方案2】:我唯一的建议是确保地图已初始化并在范围内。否则,我不确定,我从未见过,但我现在使用的是 VS2008。
【讨论】:
是的,它已初始化,我有时必须停止调试器并添加一个循环遍历地图,这样我才能看到值是什么:(也许 2008 年是答案(或者至少是一个好的转移)【参考方案3】:我一直无法使用 Intel 解决此问题,但我现在已迁移到最新的 Visual Studio 编译器 VS2010,这不再是问题。我将此标记为答案,因为我不想留下未回答的问题。
【讨论】:
以上是关于VS2005 中损坏的 std::map 可视化器的主要内容,如果未能解决你的问题,请参考以下文章
与 VS2013 相比,gcc 4.7.2 中的 std::map 实现效率非常低?
如何在 API 中隐藏迭代器以使用 std::map 包装器中的项目