【问题标题】:Visual C++ 2010 refuses to show std::string value when debugging. Shows <Bad Ptr>Visual C++ 2010 在调试时拒绝显示 std::string 值。显示 <Bad Ptr>
【发布时间】:2012-12-03 09:39:48
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 要回答这个问题,我们需要一些发生此错误的可编译代码。
  • 无论如何,这都会发生在所有代码上。如果我使用 std::string 它在调试器中显示为 。这可能是我的项目配置存在问题,并且在某处启用了一些优化,或者我的调试符号未正确加载。我在谷歌上做了一些搜索,还没有找到答案。我还发现了一些关于 autoexp.dat 的东西,它可以调试可视化数据以使更复杂的类型易于调试。我认为 autoexp.dat 会以某种方式绕过小字符串优化并在所有情况下正确显示它。我再看一下。
  • 你可以使用 const char* test = str.c_str();在此语句之后,调试器将显示值。

标签: c++ string debugging std


【解决方案1】:

遇到了同样的问题,并通过更改 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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Visual Studio 的调试可视化工具还不错。它们完全有能力处理微软自己的优化,并在默认项目设置下正确显示任何长度的 std::string。
      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多