调试包含字符串的 TValue

Debugging TValue containing a string

我在调试时无法检查 TValue 变量的字符串值。悬停菜单不显示字符串值,甚至将其添加到监视列表似乎也很棘手。

给定一个非常基本的示例控制台应用程序,例如

program Project1;

uses
  System.SysUtils, System.Rtti;

var
  Value: TValue;
begin
  Value := 'Hello';
  WriteLn(Value.AsType<string>);
  ReadLn;
end.

WriteLn 行添加断点,我可以将鼠标悬停在 Value 变量上并查看值类型,但实际上没有关于字符串值的任何信息,请参阅

接下来我尝试将它添加到监视列表中,使用 .AsType<string> - 但是监视列表错误 - 示例应用程序中的内部错误,E2531(方法需要显式类型参数)在我的实际应用程序中。 check/uncheck 允许副作用和功能的选项没有区别 .

最终起作用的是为转换创建一个函数,例如

function ValueToString(const Value: TValue): string;
begin
  Result := Value.AsType<string>;
end;

并在监视列表中使用它。不过,我不得不在应用程序代码中使用此函数(例如,在示例中的 WriteLn 调用中)以避免它被链接器删除。这也意味着我必须将此功能或包含此功能的单元添加到我要调试的每个单元。

有更好的解决方案吗?

在手表中使用 TValue 的内置 Value.ToStringValue.AsString 也评估。

您也可以使用 Value.AsVariant