如何在 Delphi 调试期间查看通用 tList
How to look into generic tList during Delphi debugging
我使用 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>
?
通常应该可以在 List
属性 上看到包含数组的列表。在内部只有一个类型为 Pointer
的字段,这与 10.3 之前的类型不同,当时它的类型为 TArray<T>
.
这是我在分配给 Caption
的行中放置一个断点并将这两个条目放入我的手表时看到的:
更新:您在这里遇到的问题似乎是链接器造成的。当你在 watch
中取消勾选 "allow side effects and function calls" 的选项时
手表window会显示:
我以前在使用仅在单元的实现部分指定的泛型时看到过这种行为(FWIW,当我第一次尝试重现时,我没有将您发布的代码放入 VCL 项目中,而是放入一个控制台 dpr,那个没有实现部分,所以我没有看到这种行为)。
强制链接器不删除符号或调试器实际看到它(因为即使我禁用内联以强制 GetList 方法保留手表 window 也会告诉我它已被删除) 你可以简单地将一些虚拟类型放入这个或任何其他单元的 interface
部分。
type TDummy = TList<Integer>;
这将使调试器看到符号并看到手表中的值 window。
我使用 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>
?
通常应该可以在 List
属性 上看到包含数组的列表。在内部只有一个类型为 Pointer
的字段,这与 10.3 之前的类型不同,当时它的类型为 TArray<T>
.
这是我在分配给 Caption
的行中放置一个断点并将这两个条目放入我的手表时看到的:
更新:您在这里遇到的问题似乎是链接器造成的。当你在 watch
中取消勾选 "allow side effects and function calls" 的选项时手表window会显示:
我以前在使用仅在单元的实现部分指定的泛型时看到过这种行为(FWIW,当我第一次尝试重现时,我没有将您发布的代码放入 VCL 项目中,而是放入一个控制台 dpr,那个没有实现部分,所以我没有看到这种行为)。
强制链接器不删除符号或调试器实际看到它(因为即使我禁用内联以强制 GetList 方法保留手表 window 也会告诉我它已被删除) 你可以简单地将一些虚拟类型放入这个或任何其他单元的 interface
部分。
type TDummy = TList<Integer>;
这将使调试器看到符号并看到手表中的值 window。