UnicodeString::Length() мешает отображению отладчика

Кажется, что отладчик подавляет просмотр содержимого UnicodeString в окнах Local Variable и Watch, когда текущая функция содержит вызов UnicodeString::Length().

Запуск 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" для ее длины)?

1 ответ

Решение

После некоторых экспериментов я теперь могу частично ответить на свой вопрос с потенциальным обходным путем. Замена "search.Length()" на "wcslen(search.c_str())", кажется, работает, по крайней мере, у него нет побочного эффекта отображения только адресов для UnicodeStrings в списке наблюдения и окнах локальных переменных. На данный момент я не проверил тщательно, если это в конечном итоге поднимает какую-то другую проблему. Но почему я должен делать это для такого фундаментального типа языка?

Другие вопросы по тегам