0

我有一个大的cmake生成的解决方案,其中包含许多项目。出于某种原因,我无法查看字符串的内容,因为根据调试器_Bx._Buf包含一些垃圾。Visual Studio 2013调试器显示std :: string的奇怪值

text.c_str()正确返回"Hello"

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

为了清楚起见:在之后执行了赋值行,屏幕截图为。所以并不是文本是未初始化的。

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

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

调试器类型设置为“自动”,但我已经试过“混合”和“天然只有”太多,但它是全部都一样。我看不到字符串。

有没有人有线索什么设置导致此行为?

enter image description here

+1

无法使用Visual Studio 2015进行重现。它是否适用于从头构建的简单“Hello World”项目?您是否调试过发布版本? –

+1

您是否在优化开启的情况下进行编译?如果是这样的话,编译器甚至不会初始化字符串。 – NathanOliver

+2

包含[mcve]的邮政编码。调试器非常不可能被破坏,你是第一个注意到的。 –

回答

0

一个可能的原因是,您使用(在他的CMake项目)的STL的版本不匹配他们有STL.Natvis。在我的VS 2013(微软的Visual Studio 12.0 \ Common7 \包\调试\展示台\ stl.natvis),basic_string的有两个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> 

而且

<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> 

因为你可以得到相同的在将STL显示字符串输入到监视窗口期间,您可能需要为您的std :: string使用不同的STL.natvis才能使其正常工作。您应该尝试进入text.c_str()以查看它实际返回的内容。我觉得这是一个更新的STL。

+0

使用更新版本的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 <= this-> _Myres \t \t \t _STD addressof(*此 - > _ Bx._Ptr) \t \t \t:这 - > _ Bx._Buf); \t \t}' –

+0

@ F.E。土地,只是为了明确这个问题,你的意思是你在观察窗口得到了这个问题。在观察窗口输入以下内容: Text.c_str()。 Text._Myptr() Text._Myres Text._Bx _BUF_SIZE,结果如何?据我所知,natvis只是评估表达式,你可以手工评估所有这些相同的表达式。 –

+0

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 :: _ St​​ring_val > :: _ Val_types> :: __ Ut1 –

相关问题