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

时间:2017-05-09 11:33:46

标签: c++ debugging visual-studio-2013 visual-studio-debugging

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

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

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

为清楚起见:在分配行执行后,屏幕截图是。因此,文本不是未初始化的。

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

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

调试器类型设置为" Auto"但我试过"混合"和#34;原生只有"它也是一样的。我看不到字符串。

有没有人知道什么设置会导致这种行为?

enter image description here

1 个答案:

答案 0 :(得分:0)

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

...
__weak __typeof(self) weakSelf = self;
[myAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {

    textField.keyboardType = UIKeyboardTypeDefault;
    textField.text = [weakSelf.myTextView.text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];

}];
...

并且

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

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