Visual Studio调试器无法在调试中正确显示std :: string

时间:2019-10-16 10:06:50

标签: c++ visual-studio-debugging visual-studio-2019 stdstring

我和我的团队在我暂停程序时Visual Studio显示乱码而不是正确的字符串内容时遇到问题。其中的字符串具有正确的数据,只是VS的调试器以某种方式丢失。

我用绿色标记了正确的内容,用红色标记了不正确的内容。

std::string gibberish issue in VS 16.3.4

您可以看到std::string定义为

const std::string testStdString = "contents of std::string";

在调试悬停和监视窗口中显示为"\bÄĎD\x19"。但是.c_str()的C字符串显示正常。用cout写入的控制台也可以正常显示。 每次运行此破损值都会改变。

在原始视图模式下,您可以看到以ASCII形式显示的指针内容看起来像调试器认为的字符串内容。那么也许是一些短字符串优化相关的问题?

raw view of the string

如果将其解码为字符串:

"\bÄĎD\x19"
    [0x00000000]: 0x08 '\b'
    [0x00000001]: 0xc4 'Ä'
    [0x00000002]: 0xcf 'Ď'
    [0x00000003]: 0x44 'D'
    [0x00000004]: 0x19 '\x19'
    [0x00000005]: 0x00 '\0'

它与原始视图中可见的buf属性相匹配:0x0000001944cfc408(反向)。

问题仅影响std::stringstd::wstring,并且C字符串可以正常工作。当我尝试使用std::string::c_str()时,它也可以正常工作。

当我尝试一个简单的新项目时,不会发生此问题-但是在我们的带有本机C ++和C#UWP解决方案的18解决方案中,确实发生了。

我们不使用任何非Microsoft编译器或标准库。我们在最新的Visual Studio 2019(16.3.4)上都将VC142编译器与/permissive-(一致性模式)一起使用。尝试过VS141,没有帮助。

此问题在某些更新后开始发生,至少在VS 16.3.4之前没有得到解决。它确定使用的先前版本肯定是VS 2017,但我的一些团队说也许2019早期的版本也适用于它们。

可能相关(但未得到解答,关于VS 2013):Visual Studio 2013 debugger showing weird values for std::string

我在the Visual Studio Developer Community中报告了该问题,也许他们会知道一些。

更新2019-10-22:

试图通过复制项目并删除库,引用的项目和共享项目来创建最小项目,但保留主项目和解决方案的配置-无法以这种方式复制问题。因此,这不是(仅仅是)配置,而是有关链接的项目和库的内容。这些项目/库由VS构建,或者来自Windows SDK或Intel Media SDK。
稍后将尝试将它们一一删除,这可能有助于查明问题所在。

1 个答案:

答案 0 :(得分:0)

我们团队中的某个人找到了可能的解决方法,我们确实有不同的CRT。其中一个库为/MD,而其他库为/MDd。但是改变这一点并不能解决很多问题。 我们使用/MD,因为在/MDd下,磁带库出现故障。有问题的库是Intel Media SDK的mfx_dispatch项目。

解决此问题的方法是将该库的工具集从141更改为142。在后者上,std::string在监视窗口中可读。

调试器仍然存在不同的问题,但这是最糟糕的问题。