Visual C++ 2010 在调试时拒绝显示 std::string 值。显示 <Bad Ptr>
Posted
技术标签:
【中文标题】Visual C++ 2010 在调试时拒绝显示 std::string 值。显示 <Bad Ptr>【英文标题】:Visual C++ 2010 refuses to show std::string value when debugging. Shows <Bad Ptr> 【发布时间】:2012-12-03 09:39:48 【问题描述】:我有一种奇怪的感觉,好像这是最近的问题,并且发生在两台不同的计算机上。
当我调试并尝试从 STL 查看 std::string 的值时,它显示为值。它说它的大小是 15,容量是一个乱码。
数组值本身都说CXX0030:错误:无法计算表达式。
这非常令人沮丧,如果我在字符串上调用 c_str 并将其分配给 char * 或在需要时使用监视表达式,我仍然可以在调试时访问字符串值,但这非常乏味并且让生活非常艰难连续 3 天调试复杂问题。
其他 STL 容器的内容显示得很好。
这发生在两台不同计算机上的多个项目上,我很确定我已经为项目设置了所有调试选项。没有优化,肯定会生成调试信息。
【问题讨论】:
要回答这个问题,我们需要一些发生此错误的可编译代码。 无论如何,这都会发生在所有代码上。如果我使用 std::string 它在调试器中显示为遇到了同样的问题,并通过更改 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。以上是关于Visual C++ 2010 在调试时拒绝显示 std::string 值。显示 <Bad Ptr>的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010 远程调试 - 无法连接:拒绝访问
Visual C++ 2010 - CL.exe 退出代码 5
调试由 C# Visual Studio 2010 插件导入的 C++ dll