В статье будет рассмотрен вопрос отладки генерализованных списков в среде разработки Delphi 10.3.1. В частности, будет обсуждаться проблема, с которой сталкиваются разработчики при попытке просмотра содержимого списка tList<Integer> во время отладки. Проблема связана с тем, что в последних версиях Delphi не поддерживается устаревшая функция отладки, позволяющая просматривать содержимое генерализованных списков. В качестве примера будет использован код, в котором создаются два списка: tList<tRecord> и tList<Integer>, и попытка вывести их содержимое в отладочном режиме.
Пример кода на Object Pascal (Delphi):
type
tRecord = record
Field: Integer;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
_Record: tRecord;
_List1: TList<tRecord>;
_List2: TList<Integer>;
i: Integer;
begin
_List1 := TList<tRecord>.Create;
_List2 := TList<Integer>.Create;
for i := 0 to 4 do
begin
_Record.Field := i;
_List1.Add(_Record);
_List2.Add(i);
end;
Caption := IntToStr(_List1.List[0].Field) + IntToStr(_List2.List[0]);
_List1.Free;
_List2.Free;
end;
Описание проблемы и её решения:
Как показано в примере кода, разработчик может свободно просматривать содержимое списка tList<tRecord> через свойство List, однако сталкивается с трудностями при попытке сделать то же самое для tList<Integer>. Это связано с изменениями в компиляторе Delphi, которые затрудняют доступ к внутренним свойствам генерализованных списков.
Подтвержденный ответ на данную проблему предполагает, что обычно должно быть возможно увидеть содержимое списка через свойство List. Однако из-за изменений в линкере, которые были внесены в версии после 10.3, свойство List теперь является полем типа Pointer, в отличие от предыдущих версий, где оно было типа TArray<T>.
Чтобы решить проблему, можно использовать следующий подход:
Включите в раздел interface вашего модуля объявление типа TDummy, которое будет представлять интересующий вас генерализованный список:
type
TDummy = TList<Integer>;
Это заставит линкер не удалять символ, и отладчик сможет увидеть содержимое списка в окне просмотра выражений.
Альтернативные шаги:
Убедитесь, что в настройках окна просмотра выражений включена опция "allow side effects and function calls".
Попробуйте перекомпиляцию проекта, возможно, проблема кроется в настройках оптимизации или в кэше компилятора.
Заключение:
Хотя предложенный метод является рабочим, он не является очевидным решением. Это указывает на наличие потенциальной проблемы в среде разработки Delphi, которая была отмечена в официальном отчете Embarcadero (https://quality.embarcadero.com/browse/RSP-22014). Разработчикам рекомендуется следить за обновлениями и возможными исправлениями, связанными с этой проблемой.
Обратите внимание, что приведенный пример кода и рекомендации актуальны для версии Delphi 10.3.1. В будущих обновлениях могут быть внесены изменения, которые повлияют на процесс отладки и требуемые методы решения возникающих проблем.
В статье обсуждается проблема отладки генерализованных списков в среде Delphi 10.3.1, связанная с невозможностью просмотра содержимого списка `tList` из-за изменений в компиляторе, и предлагается способ решения этой проблемы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.