Visual Studio 2013调试器显示std :: string的奇怪值
我有一个大的cmake生成的解决方案,其中包含许多项目。出于某种原因,我无法查看字符串的内容,因为根据调试器_Bx._Buf
包含一些垃圾。Visual Studio 2013调试器显示std :: string的奇怪值
text.c_str()
正确返回"Hello"
。
这个问题不仅发生在本地字符串上。返回std::string
的函数在调试器中看起来也是垃圾,而实际上它们是确定的。
为了清楚起见:在之后执行了赋值行,屏幕截图为。所以并不是文本是未初始化的。
另一个信息:如果我在visual studio中创建一个新的控制台项目,那么它工作正常,我可以看到任何字符串的内容。这只是这个cmake生成的项目,我遇到了问题。
的字符集的项目属性设置为“使用多字节字符集”
调试器类型设置为“自动”,但我已经试过“混合”和“天然只有”太多,但它是全部都一样。我看不到字符串。
有没有人有线索什么设置导致此行为?
一个可能的原因是,您使用(在他的CMake项目)的STL的版本不匹配他们有STL.Natvis。在我的VS 2013(微软的Visual Studio 12.0 \ Common7 \包\调试\展示台\ stl.natvis),basic_string的有两个natvis条目:
<Type Name="std::basic_string<char,*>">
<DisplayString Condition="_Myres < _BUF_SIZE">{_Bx._Buf,s}</DisplayString>
<DisplayString Condition="_Myres >= _BUF_SIZE">{_Bx._Ptr,s}</DisplayString>
<StringView Condition="_Myres < _BUF_SIZE">_Bx._Buf,s</StringView>
<StringView Condition="_Myres >= _BUF_SIZE">_Bx._Ptr,s</StringView>
<Expand>
<Item Name="[size]">_Mysize</Item>
<Item Name="[capacity]">_Myres</Item>
<ArrayItems>
<Size>_Mysize</Size>
<ValuePointer Condition="_Myres < _BUF_SIZE">_Bx._Buf</ValuePointer>
<ValuePointer Condition="_Myres >= _BUF_SIZE">_Bx._Ptr</ValuePointer>
</ArrayItems>
</Expand>
</Type>
而且
<Type Name="std::basic_string<unsigned short,*>">
<AlternativeType Name="std::basic_string<wchar_t,*>" />
<DisplayString Condition="_Myres < _BUF_SIZE">{_Bx._Buf,su}</DisplayString>
<DisplayString Condition="_Myres >= _BUF_SIZE">{_Bx._Ptr,su}</DisplayString>
<StringView Condition="_Myres < _BUF_SIZE">_Bx._Buf,su</StringView>
<StringView Condition="_Myres >= _BUF_SIZE">_Bx._Ptr,su</StringView>
<Expand>
<Item Name="[size]">_Mysize</Item>
<Item Name="[capacity]">_Myres</Item>
<ArrayItems>
<Size>_Mysize</Size>
<ValuePointer Condition="_Myres < _BUF_SIZE">_Bx._Buf</ValuePointer>
<ValuePointer Condition="_Myres >= _BUF_SIZE">_Bx._Ptr</ValuePointer>
</ArrayItems>
</Expand>
</Type>
因为你可以得到相同的在将STL显示字符串输入到监视窗口期间,您可能需要为您的std :: string使用不同的STL.natvis才能使其正常工作。您应该尝试进入text.c_str()以查看它实际返回的内容。我觉得这是一个更新的STL。
使用更新版本的stl.natvis不能解决我的问题。通过检查c_str返回什么意思?我已经调试到c_str中,其中导入到C:\ Program Files文件(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ xstring其中的代码:'const value_type * _Myptr()const \t \t {\t // //确定当前指针以缓冲对nonmutable串 \t \t返回(这 - > _ BUF_SIZE _Myres \t \t \t _STD addressof(*此 - > _ Bx._Ptr) \t \t \t:这 - > _ Bx._Buf); \t \t}' –
@ F.E。土地,只是为了明确这个问题,你的意思是你在观察窗口得到了这个问题。在观察窗口输入以下内容: Text.c_str()。 Text._Myptr() Text._Myres Text._Bx _BUF_SIZE,结果如何?据我所知,natvis只是评估表达式,你可以手工评估所有这些相同的表达式。 –
text.c_str()\t 0x000000000022aac8 “你好” \t为const char * text._Myptr()\t 0x000000000022aac8 “你好” \t为const char * text._Myres 无符号__int64 text._BUF_SIZE \t _BUF_SIZE(16) STD :: _ String_val
无法使用Visual Studio 2015进行重现。它是否适用于从头构建的简单“Hello World”项目?您是否调试过发布版本? –
您是否在优化开启的情况下进行编译?如果是这样的话,编译器甚至不会初始化字符串。 – NathanOliver
包含[mcve]的邮政编码。调试器非常不可能被破坏,你是第一个注意到的。 –