4

我使用 Delphi 10.3.1 COMMUNITY 版本,在调试项目时无法查看通用 tList。

我知道最新版本的 Delphi 不支持允许查看通用 tList 的旧类型调试功能。所以我在下面的代码中使用了 tList.List 来评估 tList。

tList<tRecord>.List我可以调查它,但不能在tList<Integer>.List.

在此处输入图像描述

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<Integer>在调试过程中如何查看?

4

1 回答 1

8

通常应该可以在List属性上看到包含数组的列表。Pointer与 10.3 之前的 type 不同,在内部只有一个 type 字段TArray<T>

这就是当我在它分配的行中放置一个断点并将Caption这两个条目放入我的手表时看到的:

在此处输入图像描述

更新:看起来链接器对您在此处遇到的问题负责。当您在手表中取消选中“允许副作用和函数调用”选项时

在此处输入图像描述

监视窗口将显示:

在此处输入图像描述

在使用仅在单元的实现部分中指定的泛型之前,我已经看到过这种行为(FWIW,当我第一次尝试复制时,我没有将您发布的代码放入 VCL 项目,而是放入控制台 dpr 并且一个没有实现部分,所以我没有看到这种行为)。

要强制链接器不删除符号或调试器实际看到它(因为即使我禁用内联以强制 GetList 方法停留,监视窗口会告诉我它已被删除)你可以简单地把一些虚拟类型放入这个或任何其他单位的interface一部分。

type TDummy = TList<Integer>;

这将导致调试器查看符号并查看监视窗口中的值。

于 2019-06-12T11:43:46.760 回答