8

我有一种奇怪的感觉,好像这是最近的问题,并且发生在两台不同的计算机上。

当我调试并尝试从 STL 查看 std::string 的值时,它显示为值。它说它的大小是 15,容量是一些乱码。

数组值本身都说 CXX0030:错误:无法评估表达式。

这非常令人沮丧,如果我在字符串上调用 c_str 并将其分配给 char * 或在需要时使用 watch 表达式,我仍然可以在调试时访问字符串值,但这非常乏味,并且在调试复杂问题时会变得非常困难连续3天。

其他 STL 容器的内容显示得很好。

这发生在两台不同计算机上的多个项目上,我很确定我已经为项目设置了所有调试选项。没有优化,并且肯定会生成调试信息。

4

3 回答 3

4

有同样的问题并通过更改 autoexp.dat 中的可视化工具来修复它。它位于:“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\autoexp.dat”或类似的地方,具体取决于您的 Visual Studio 和 Windows 版本。

“std::basic_string”的变化:

替换 $e._BUF_SIZE

通过 sizeof($e._Bx._Buf)/sizeof(char)

或 sizeof($e._Bx._Buf)/sizeof(wchar_t)

https://connect.microsoft.com/VisualStudio/feedback/details/677683/std-string-incorrectly-displayed-in-debugger

于 2014-06-25T11:51:28.093 回答
3

这可能是Microsoft 确认的与自定义迭代器调试级别相关的错误(不幸的是,在 VS2010 中未修复)的一个实例。我自己刚刚碰到这个问题,据我的测试显示,这个错误是由使用默认的“多线程调试 DLL”运行时定义 _HAS_ITERATOR_DEBUGGING=0 引起的(需要 VC redist 在其他 PC 上运行你的 exe) .

如果确实如此,那么至少有两种方法可以修复它(升级到 VS2012 的不足)——在我的情况下都经过测试和工作:

1) 删除 _HAS_ITERATOR_DEBUGGING=0 定义。如果您在时间关键代码中大量使用 STL,这可能会显着降低调试构建的性能。由于默认情况下不存在这样的定义,我想添加它的人这样做是有充分理由的(就像我一样)。

2) 切换您的调试配置以使用“多线程调试”运行时(即静态链接 CRT)。由于您可能仅将调试配置用于开发和内部调试,因此这不会导致任何问题。您可以保留共享运行时以进行发布配置(因为您可能无论如何都无法正确调试它)。

请注意,这两种解决方案还需要调整所有依赖项(静态/动态库)中的相应设置并重建它们,否则您将无法再链接到它们。

于 2013-08-01T22:16:47.867 回答
0

听起来像是工作中的小字符串优化。VS2010 最多 16 个字符。在这种情况下,没有指向字符串开头的指针,也没有容量成员,而是这些字节用于字符串内容本身。

于 2012-12-03T11:58:45.773 回答