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 的东西,它可以调试可视化数据以使更复杂的类型易于调试。我认为 autoexp.dat 会以某种方式绕过小字符串优化并在所有情况下正确显示它。我再看一下。 你可以使用 const char* test = str.c_str();在此语句之后,调试器将显示值。 【参考方案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。

以上是关于Visual C++ 2010 在调试时拒绝显示 std::string 值。显示 <Bad Ptr>的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 远程调试 - 无法连接:拒绝访问

Visual C++ 2010 - CL.exe 退出代码 5

调试由 C# Visual Studio 2010 插件导入的 C++ dll

Visual Studio 拒绝在调试后暂停

尝试使用 Visual Studio 2010 调试 dll (C++) 时出现错误消息

Visual C++:运行时内存调试器刷新