【问题标题】:UnicodeString::Length() interferes with debugger displayUnicodeString::Length() 干扰调试器显示
【发布时间】: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


【解决方案1】:

经过一些试验,我现在可以通过潜在的解决方法部分回答我自己的问题。用“wcslen(search.c_str())”替换“search.Length()”似乎是可行的,至少它没有在监视列表和局部变量窗口中仅显示 UnicodeStrings 地址的副作用。在这一点上,我还没有彻底测试这是否最终会引发其他问题。但是为什么我必须为这种语言的基本类型这样做呢?

【讨论】:

  • 您不应该这样做。这是一个错误。
  • 是的,也许我不应该这样做,但是一旦我在实际项目中替换了它们(通过#ifdef 语句,所以它只在调试时完成),让我能够找到一个讨厌的错字,因为我可以看到 UnicodeStrings 的值。在修复错误之前,我会保留我的技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2020-10-21
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多