C++ Visual Studio 2013调试器显示std::string的奇怪值

C++ Visual Studio 2013调试器显示std::string的奇怪值,c++,debugging,visual-studio-2013,visual-studio-debugging,C++,Debugging,Visual Studio 2013,Visual Studio Debugging,我有一个由cmake生成的大型解决方案,其中包含许多项目。由于某些原因,我无法查看字符串的内容,因为根据调试器\u Bx.\u Buf包含一些垃圾 text.c_str()正确返回“Hello” 这个问题不仅仅发生在本地字符串上。返回std::string的函数在调试器中看起来也是垃圾函数,而实际上它们是正常的 为清楚起见:屏幕截图是在执行任务行之后制作的。因此,文本并不是未初始化的 另一个信息:如果我在VisualStudio中创建一个新的控制台项目,那么它可以正常工作,我可以看到任何字符串的

我有一个由cmake生成的大型解决方案,其中包含许多项目。由于某些原因,我无法查看字符串的内容,因为根据调试器
\u Bx.\u Buf
包含一些垃圾

text.c_str()
正确返回
“Hello”

这个问题不仅仅发生在本地字符串上。返回
std::string
的函数在调试器中看起来也是垃圾函数,而实际上它们是正常的

为清楚起见:屏幕截图是在执行任务行之后制作的。因此,文本并不是未初始化的

另一个信息:如果我在VisualStudio中创建一个新的控制台项目,那么它可以正常工作,我可以看到任何字符串的内容。这是唯一一个我有问题的cmake生成的项目

项目属性的字符集设置为“使用多字节字符集”

调试器类型设置为“Auto”,但我也尝试过“Mixed”和“native Only”,但都是一样的。我看不到线

有人知道是什么环境导致了这种行为吗


一个可能的原因是您正在使用的STL版本(在他的CMake项目中)与他们的STL.Natvis不匹配。在我的VS 2013(Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\stl.natvis)上,基本字符串有两个natvis条目:

<Type Name="std::basic_string&lt;char,*&gt;">
    <DisplayString Condition="_Myres &lt; _BUF_SIZE">{_Bx._Buf,s}</DisplayString>
    <DisplayString Condition="_Myres &gt;= _BUF_SIZE">{_Bx._Ptr,s}</DisplayString>
    <StringView Condition="_Myres &lt; _BUF_SIZE">_Bx._Buf,s</StringView>
    <StringView Condition="_Myres &gt;= _BUF_SIZE">_Bx._Ptr,s</StringView>
    <Expand>
        <Item Name="[size]">_Mysize</Item>
        <Item Name="[capacity]">_Myres</Item>
        <ArrayItems>
            <Size>_Mysize</Size>
            <ValuePointer Condition="_Myres &lt; _BUF_SIZE">_Bx._Buf</ValuePointer>
            <ValuePointer Condition="_Myres &gt;= _BUF_SIZE">_Bx._Ptr</ValuePointer>
        </ArrayItems>
    </Expand>
</Type>

{u Bx.{u Buf,s}
{{u Bx.{u Ptr,s}
_Bx._Buf,s
_Bx._Ptr,s
_神秘化
_迈尔斯
_神秘化
_Bx._Buf
_Bx.\u Ptr


{u Bx.{u Buf,su}
{u Bx.{u Ptr,su}
_Bx._Buf,苏
_Bx.\u Ptr,su
_神秘化
_迈尔斯
_神秘化
_Bx._Buf
_Bx.\u Ptr

由于在将STL显示字符串输入“监视”窗口时可以获得相同的值,因此std::string可能需要不同的STL.natvis才能正常工作。您应该尝试进入text.c_str()查看它实际返回的内容。我觉得这是一个较新的STL。

无法用Visual Studio 2015复制。它是否适用于从零开始构建的简单“Hello World”项目?您是否调试了发布版本?是否在启用优化的情况下编译?如果是这样的话,编译器甚至从未初始化过包含字符串的string.Post代码。调试器不太可能坏得很厉害,你是第一个注意到的。它可以与一个简单的Hello World应用程序一起工作。这是一个x64调试版本。优化已关闭。请确保断点位于字符串声明之后。使用较新版本的stl.natvis无法解决我的问题。检查c_str返回的内容是什么意思?我已经调试到c_str中,其中引入了c:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\include\x字符串中的代码:
const value\u type*\u Myptr()const{//确定当前指向缓冲区的指针以返回不可更改的字符串(this->\u BUF\u SIZE\u Myres?\u STD addressof(*this->\u Bx.\u Ptr):this->\u Bx.\u BUF)}
@F.E.Land,为了清楚地说明这个问题,您的意思是您在监视窗口中得到了这个问题,请在监视窗口中输入以下内容:Text.c_str()。Text.\u Myptr()Text.\u Myres Text.\u Bx\u BUF\u大小,结果如何?据我所知,natvis只是计算表达式,你可以手工计算所有相同的表达式。text.cèu str()0x00000000002aac8“Hello”const char*text.\u Myptr()0x00000000002aac8“Hello”const char*text.\u Myres 8790823929686 unsignedèu int64 text.\u BUFèu SIZE.\u BUFèSIZE(16)std::_String_val::__ut1至少自2012年以来,这是一种非常常见的情况,并且在2017年仍然存在。它发生在调试版本和发布版本中。
<Type Name="std::basic_string&lt;unsigned short,*&gt;">
    <AlternativeType Name="std::basic_string&lt;wchar_t,*&gt;" />
    <DisplayString Condition="_Myres &lt; _BUF_SIZE">{_Bx._Buf,su}</DisplayString>
    <DisplayString Condition="_Myres &gt;= _BUF_SIZE">{_Bx._Ptr,su}</DisplayString>
    <StringView Condition="_Myres &lt; _BUF_SIZE">_Bx._Buf,su</StringView>
    <StringView Condition="_Myres &gt;= _BUF_SIZE">_Bx._Ptr,su</StringView>
    <Expand>
        <Item Name="[size]">_Mysize</Item>
        <Item Name="[capacity]">_Myres</Item>
        <ArrayItems>
            <Size>_Mysize</Size>
            <ValuePointer Condition="_Myres &lt; _BUF_SIZE">_Bx._Buf</ValuePointer>
            <ValuePointer Condition="_Myres &gt;= _BUF_SIZE">_Bx._Ptr</ValuePointer>
        </ArrayItems>
    </Expand>
</Type>