Visual Studio无法显示std :: string的值

问题描述 投票:-1回答:1

[我在公司工作的公司中,有些人受到Visual Studio中的错误/错误的影响。调试器无法显示std :: string的值/内容。它显示“读取字符串的字符时出错。”

一些问题图片:Simple string varsValues in debugger

以下行将始终重现问题,但通常,代码中的每个字符串(至少〜1'000'000行)都将出现问题。

std::string testVar = "Something";

编辑:将尝试尽快制作一个最小的可复制示例,但是现在我无法创建一个示例。仅在包含93个项目的单个解决方案中出现此问题。到目前为止已尝试:具有相同编译器版本(v120),任何编译器版本,相同预处理器定义,VS2013和VS2017的新解决方案(专业和企业均会产生此问题)。现在安装VS2019进行测试。

我从const char *构造了字符串,所以这可能与内存分配无关,等等... 最重要的是,代码起作用了。因此,std :: string本身就可以正常工作应该,但是调试器无法显示其值。据我所见,大小是正确的,但容量始终为0xcccccccccccccccccc。对于字符串中的字符说:“无法读取内存”。Detailed view of string in debugger

此问题仅在std :: string时发生,而在std :: wstring或char *或其他任何情况下均不发生。另外,当我打开一个新的解决方案时,std :: string将正确显示。它只能在超过91个项目的解决方案中显示。在VS2017和VS2013中均可重现,但我们使用的是v120编译器。尝试过const变量,并将该变量放在堆或堆栈上都没关系。

此外,它仅在调试版本中发生,在发布模式下调试器可以正常工作。

此错误自本周以来一直存在,我们之前甚至一个多星期之前都无法观察到这种错误。我们中的3个人有此问题,但其他几个则没有。我们大多数人都在相同配置和更新的相同机器上运行。一个区别是,工作的VS是Professional,而我们使用的是Enterprise版本。

我知道这不是一个严重的问题,因为代码可以正常工作,但这有时会使调试变得更加困难。

编辑:可能很重要,当通过逐步执行指令进行调试时,调试器将不会进入构造函数或任何std :: string函数(在xstring中),因为它是一个简单的int变量赋值,它只会跳过它,不是函数调用。但是,在std :: string的源代码中设置断点实际上将起作用,并且调试器将在此处停止。

EDIT2-找到了错误的原因,但还没有真正的解决方案

分析了std :: string中的指针的值后,我发现了调试器为何无法提取字符串的原因。调试器使用+8字节偏移量查找它。解释一下:假设我创建了一个std :: string,并获取它的指针。

std::string testStr = "test";
std::string* strPtr = &testStr;

然后,strPtr = 0x0000000001bdf4a8。现在,当我查看调试器的“ Locals”窗口时,查找字符串的Raw View并在_Bx联合中找到指针,然后:_Buf = 0x0000000001bdf4b0这是strPtr + 8。这就是为什么它无法解码字符串的内容。因为它试图用错误的地址解释它。如果我要这样做:

std::string* fixedStr = reinterpret_cast<std::string*>(reinterpret_cast<char*>(&testStr)-8);

因此,当我手动将指针减少8个字节并将其重铸为字符串时,调试器将正确显示其内容。 (当然,此字符串已损坏,将不起作用,只有调试器显示是固定的)

当我打开一个新的解决方案并以相同的方式查看字符串的地址时,调试器会为_Buf显示与字符串的指针相同的地址,这是正常的行为。两者之间的区别在于,当无法对字符串进行十进制解码时,std :: _ Container_base的类型为std :: _ Container_base12并具有内容,而当其工作时,其具有std :: __ Container_base0且具有零内容。这些额外的内容可能导致额外的8个字节。

我找到但未提供解决方案的相关内容(尝试了这里的方法,但问题仍然存在):Visual C++ 2010 refuses to show std::string value when debugging. Shows <Bad Ptr>

Visual Studio debugger doesn't display std::string properly in debug

https://developercommunity.visualstudio.com/content/problem/782573/visual-studio-debugger-doesnt-display-stdstring-pr.html

[也尝试根据以下方法弄乱natvis:How to visualise a simple std::string with natvis?

c++ string visual-studio debugging visual-studio-debugging
1个回答
0
投票

解决方案:此问题是由以下预处理程序定义引起的:

_HAS_ITERATOR_DEBUGGING=0

这与std :: __ Container_base12和std :: __ Container_base0。这是有意的,当然是设计使然。但是由于某种原因,调试器对此一无所知,并试图照常解释std :: string。

我无法删除该宏,因为很多代码都因为它而发疯了,但是当我查看它的文档时,我意识到它已被弃用。新的过程。定义是:

_ITERATOR_DEBUG_LEVEL

将这个值定义为0而不是原来的值并不能解决问题,但是将其定义为1可以解决此问题(默认值为2)。结果,我不得不禁用一些警告,以后我必须查看一下,但是问题已解决。

OLD:

无法设法找到问题的根本原因,但从带有v120构建工具的VS2013 / VS2017到VS2019 v142的解决方案。

最有可能是旧的构建工具与之有关。

© www.soinside.com 2019 - 2024. All rights reserved.