【问题标题】:Delphi: Code eliminated by linker incorrectlyDelphi:链接器错误地消除了代码
【发布时间】:2018-11-16 20:55:40
【问题描述】:

我使用的是 Delphi 10.2。我在调用 TList.Last 时遇到问题。 Evaluate 窗口告诉我函数的代码已被链接器删除。

代码sn-ps:

uses
    ModelObjects,
    ProximitySearch,
    System.Classes,
    System.UITypes,
    System.Generics.Collections,
    Winsoft.FireMonkey.FPdfView,
    Winsoft.FireMonkey.PDFium;
...

type
    TWidgetFinder = class(TObject)
private
        fFieldInfos: TList<TFieldInfo>;
        fPAnnotation: FPDF_ANNOTATION;
...

procedure TWidgetFinder.ConfigureFieldInfo;
var
    key: String;
    buffer: TBytes;
    textLen: LongWord;
    temp: String;
begin
...
    SetLength(buffer, KShortBufferLength);
    textLen := FPDFAnnot_GetStringValue(fPAnnotation, ToStringType(key), buffer, Length(buffer))
    temp := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
    fFieldInfos.Last.Name := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
...

问题是 fFieldInfos.Last.Name 为空。我以为我没有正确地将缓冲区转换为字符串。但是正确的字符串被写入 temp。当我分配给它后评估 fFieldInfos.Last.Name 时,我收到以下消息:

Function to be called, {System.Generics.Collections}TList<ModelObjects.TFieldInfo>.Last, was eliminated by linker

我已经看到建议我在初始化期间无害地调用消除函数的 SO 解决方案。但它不可能是 Delphi 随机消除代码,我必须发现每个消除都是一个错误。我不明白我做了什么告诉链接器 TList.Last 在我清楚地使用它时没有被使用。有人可以帮我理解这一点吗?

谢谢

【问题讨论】:

  • 这是一个调试器问题。代码很好。没有任何不应该被淘汰的东西。
  • 如果你的那部分代码可能在某个条件子句或循环中?
  • 链接器消除了实际代码。循环和变量可能已更改为使用寄存器,函数可能已被内联,等等......因此,调试器无法再找到它,但实际的 功能 仍然存在。如果这在调试时给您带来麻烦,请转到项目 -> 选项 -> 编译,并确保取消选中“优化”。
  • 尝试将错误归咎于优化似乎没有成效。 David Heffernan 的评论提醒我,我曾在多年前看到过在 Delphi 的调试器中运行的消除代码。所以我相信他的话,决定相信这个功能确实存在,然后继续前进。该代码现在似乎正在运行。感谢您的帮助。

标签: delphi


【解决方案1】:

TList&lt;T&gt;.Last 是一个标记为内联的函数。此类方法通常不包含在二进制文件中,因此您不能在调试期间在评估器中使用它们。如果您键入 fFieldInfos[fFieldInfos.Count-1],最有可能的情况也是如此,因为 GetItem(索引属性后面的 getter)也被标记为内联。

您可以在评估器中输入 fFieldInfos.List[fFieldInfos.Count-1] 以获取列表中的最后一项。

附:至于Name 为空的问题 - 如果TFieldInfo 是一条记录,则分配将无法正常工作,因为.Last 将返回该记录的副本并将Name 分配给该记录而不影响该记录列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多