我已经用绿色标记出正确的内容,红色标记出不正确的内容。 你可以看到,
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-strings工作正常。当我尝试使用std::string::c_str()
时,也能正常工作。
当我尝试使用一个简单的新项目时,这个问题不会发生——但在我们的18个解决方案与本地C++和C# UWP解决方案中会发生。
我们没有使用任何非Microsoft编译器或标准库。我们使用VC142编译器,带有/permissive-
(符合模式),全部使用最新的Visual Studio 2019(16.3.4)。尝试了VS141,没有帮助。
这个问题是在某次更新后开始出现的,至少直到VS 16.3.4还没有修复。之前肯定可以工作的版本是VS 2017,但我的一些团队成员说早期的2019版本对他们也有效。
可能相关(但未回答且与VS 2013有关):Visual Studio 2013调试器显示std :: string的奇怪值
我在Visual Studio开发人员社区中报告了这个问题,也许他们会知道一些东西。
更新2019-10-22:
尝试通过复制项目并删除库、引用项目和共享项目,但保留主项目和解决方案的配置来创建一个最小的项目 - 无法以这种方式复制该问题。因此,这不仅仅是配置,还涉及到链接的项目和库。这些项目/库是由VS构建的,或者来自Windows SDK或Intel Media SDK。
稍后将尝试逐个删除它们,也许这将有助于确定问题所在。
std::string
但std::wstring
显示正常,我认为这可能与std::string
内容的宽字符或窄字符显示有关。换句话说,VS 调试器将std::string
变量显示为窄字符而非宽字符。 - Richard Chambersstd::string
可以正常显示,但std::wstring
不能。提到了autoexp.dat
文件,该文件控制调试器数据的显示方式。请参见 https://dev59.com/32445IYBdhLWcg3wZJYn。 - Richard Chambers