【发布时间】:2019-04-26 06:27:36
【问题描述】:
只要当前函数包含 UnicodeString::Length() 调用,调试器似乎就会禁止在局部变量和监视窗口中查看 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”作为它的长度),有什么想法可以让“搜索”的内容出现吗?
【问题讨论】:
-
我在开始这个问题时使用的是 10.3,解决它的一个尝试是寻找任何补丁或升级。我发现当前可以下载的版本是10.31,所以我将我的系统升级到10.31,问题仍然存在。 10.3(或 10.31,所以我只是使用 10 的通用标志,认为它是 10.x 系统)没有现有标签。我没有足够的可信度来添加新标志。
-
实际上存在 10.3 的标签。我已经为你更新了你的标签。由于您使用的是最新版本,请file a bug report with Embarcadero。代码很好,所以这显然是 IDE/调试器的问题
-
附带说明,您应该在调用
SubString()时使用MaxInt而不是999999。或者您可以使用System::Pos()或Strutils::PosEx()而不是UnicodeString::Pos(),因为它们将起始索引作为输入,那么您根本不需要SubString()。或者,只需使用SQL->Text = "..."而不是SQL->Add()并让它为您解析换行符。 -
在你的旁注中,Remy,这个问题最初被发现是因为我正在追踪另一个问题并验证 SQL->Text = "..." 工作正常(但已经在盲目工作原始项目,因为我在其他地方使用过 ::Length(),所以看不到我正在调试的 UnicodeString)。当我创建上面的代码在一个单独的项目中测试该行并且仍然看不到 UnicodeString 时,我决定追查这个问题。我通过在不同的行上分离每个步骤来缩小问题的出处,使这个快速而肮脏的代码非常冗长。
标签: debugging c++builder c++builder-10.3-rio