UnicodeString :: Length()干扰调试器显示

时间:2019-04-26 06:27:36

标签: debugging c++builder c++builder-10.3-rio

每当当前函数包含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”),如何使“搜索”的内容出现?

Image showing debugger difference between including the length of string or not

1 个答案:

答案 0 :(得分:0)

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