【发布时间】:2020-02-13 02:02:00
【问题描述】:
我和我的团队在暂停程序时遇到问题,Visual Studio 显示乱码而不是正确的字符串内容。里面的字符串有正确的数据,只是VS的调试器莫名其妙丢失了。
我用绿色标记了正确的内容,用红色标记了不正确的内容。
可以看到std::string定义为
const std::string testStdString = "contents of std::string";
在调试悬停和观察窗口中显示为"\bÄĎD\x19"。但来自.c_str() 的 C 字符串显示正常。使用cout 写入的控制台也显示正常。
这个损坏的值在每次运行时都会发生变化。
在原始视图模式下,您可以看到指针内容在显示为 ASCII 时,看起来就像调试器认为的字符串内容。那么也许是一些短字符串优化相关的问题?
如果将其解码为字符串:
"\bÄĎD\x19"
[0x00000000]: 0x08 '\b'
[0x00000001]: 0xc4 'Ä'
[0x00000002]: 0xcf 'Ď'
[0x00000003]: 0x44 'D'
[0x00000004]: 0x19 '\x19'
[0x00000005]: 0x00 '\0'
它匹配原始视图中可见的buf 属性:0x0000001944cfc408(倒序)。
问题仅影响std::string、std::wstring 和 C 字符串工作正常。当我尝试使用std::string::c_str() 时,它也可以正常工作。
当我尝试使用一个简单的新项目时,不会出现此问题 - 但在我们的 18 解决方案中使用本机 C++ 和 C# UWP 解决方案时会出现。
我们不使用任何非 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。
稍后会尝试将它们一一删除,也许这将有助于查明问题。
【问题讨论】:
-
@chris 你明白监视窗口在这张图片上很重要,而不是代码?
-
您可以检查一下,调试变量时是否在上下文菜单中启用了“查看为 HEX”选项
-
FWIW,我肯定会说后来添加的原始视图作为图像效果更好。我最初的评论是专门针对监视窗口的,它可以概括为名称-值对的列表,给出该列表对应于监视窗口的指示。我没有提到的另一个好处是它允许复制不正确的文本来玩弄它。例如,这对于编码问题特别方便。
-
由于它影响
std::string但std::wstring显示正常,我认为它与std::string内容的宽字符或窄字符显示有关。换句话说,VS 调试器将std::string变量显示为窄字符而不是宽字符。 -
看看一个类似的论坛张贴 social.msdn.microsoft.com/Forums/vstudio/en-US/… 的人有相反的问题,
std::string很好,但std::wstring不是。提到了autoexp.dat文件,它控制调试器数据的显示方式。见stackoverflow.com/questions/4883238/…
标签: c++ visual-studio-debugging visual-studio-2019 stdstring