gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:20:06 31 4
gpt4 key购买 nike

当我暂停程序时,我和我的团队遇到了 Visual Studio 显示乱码而不是正确字符串内容的问题。里面的字符串数据是正确的,只是VS的调试器不知何故丢失了。

我将正确的内容标记为绿色,错误的内容标记为红色。

std::string gibberish issue in VS 16.3.4

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

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

在调试悬停和监 window 口中显示为 "\bĎD\x19"。但 .c_str() 中的 C 字符串显示正常。使用 cout 写入的控制台也显示正常。每次运行时该损坏值都会发生变化。

在原始 View 模式下,您可以看到指针内容显示为 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'

它与原始 View 中可见的 buf 属性匹配:0x0000001944cfc408(相反顺序)。

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

当我尝试使用一个简单的新项目时,不会出现此问题 - 但在我们使用 native C++ 和 C# UWP 解决方案的 18 解决方案中,会出现此问题。

我们不使用任何非 Microsoft 编译器或标准库。我们在最新的 Visual Studio 2019 (16.3.4) 上使用带有 /permissive- (一致性模式)的 VC142 编译器。尝试使用 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。
稍后会尝试将它们一一删除,也许这将有助于查明问题。

最佳答案

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

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

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

关于c++ - Visual Studio 调试器在调试中无法正确显示 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58410767/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com