每当当前函数包含UnicodeString :: Length()调用时,调试器似乎都禁止在Local Variable和Watch窗口中查看UnicodeString的内容。
运行C ++ Builder 10.3 Rio Enterprise(升级到10.31以尝试解决问题)我已经启动了一个新项目,添加了一个按钮并将以下代码放入按钮中。这是一个用于跟踪和重现问题的大量代码的精简版本。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TFDQuery* qry = new TFDQuery(NULL);
UnicodeString search = "SELECT *\rFROM Client\rWHERE id>0;";
UnicodeString currLine;
int to, len;
qry->SQL->Clear();
to = search.Pos("\r");
while (to > 0) {
currLine = search.SubString(1, to-1);
qry->SQL->Add(currLine);
//len = search.Length()-1; // Offending line
search = search.SubString(to+1, 999999);
to = search.Pos("\r");
}
currLine = search;
qry->SQL->Add(currLine);
}
下图显示了此代码的两个不同运行。一个完全如上所示(一行注释掉)。其他节目包括该行。
我担心的是调试器只显示名为“search”的变量的明显地址,如果我展开它,它会显示“????”,而不是箭头所示变量的内容。另请注意,断点位于导致调试器切换视图的行之上。如果我实际计算子串的长度(而不是为其长度放置“999999”),我怎么能得到“搜索”的内容?
经过一些实验,我现在可以用潜在的解决方法部分回答我自己的问题。用“wcslen(search.c_str())”替换“search.Length()”似乎有效,至少它没有在监视列表和局部变量窗口中仅显示UnicodeStrings地址的副作用。在这一点上,我没有彻底测试这是否最终引发了一些其他问题。但为什么我必须为这种语言的基本类型做这个呢?