如何在Delphi调试期间查看通用tList

SHI*_*Guk 4 delphi generics debugging generic-list tlist

我使用的是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;
Run Code Online (Sandbox Code Playgroud)

tList<Integer>在调试过程中如何查看?

Ste*_*nke 7

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

这是我将断点放入分配给它的行并将Caption这两个条目放入我的手表时看到的:

在此处输入图片说明

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

在此处输入图片说明

监视窗口将显示以下内容:

在此处输入图片说明

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

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

type TDummy = TList<Integer>;
Run Code Online (Sandbox Code Playgroud)

这将使调试器看到符号并在监视窗口中看到值。