抛出SysUtils.FinaliseUnits中的Delphi运行时错误216,行号不在mapfile中

Jac*_*kie 5 delphi delphi-xe

我有一个随机的运行时错误216出现在应用程序关闭.

我已尽可能调试,并在SysUtils.FinalizeUnits中抛出错误.

我已经检查了代码并确保释放所有创建的对象.

映射文件中不存在运行时错误0040054A上的数字.你知道这意味着什么吗?

任何人都可以告诉我如何找出错误是什么?

小智 8

这是非常老的 Delphi 问题 - 单元初始化/完成过程中的错误异常处理。

该问题易于重现 - 只需在任何单元的初始化块中生成任何程序错误/异常(例如被零除)。将正确创建异常。但是,在异常出现之前,单元终结过程会破坏异常对象。因此,当访问异常对象时,发生了“运行时错误 216”。

  • 非常感谢您的评论!使用您的信息,我逐个单元地调试了我的单元初始化,发现单元初始化有异常(只是它没有引起调试器)并且可以解决问题。 (2认同)

Fra*_*itt 6

我怀疑内存泄漏(到目前为止我遇到的所有运行时错误 216 都是)并使用分析器(视觉检查永远不如工具)。由于您使用的是 Delphi XE,您应该尝试一下 AQTime(它已包含在内),另请参见

Delphi - 检查内存是否“按时”释放

亲切的问候,弗兰克

  • 谢谢,我按照 Frank 的建议使用了 AQTime - 它运行良好,并帮助我追踪了一个没有正确释放的讨厌的对象。 (2认同)

Rob*_*edy 5

由于运行时错误 216 是访问冲突,这可能表明您正在尝试使用已释放的内容。

映射文件中的地址基于 0,但这不是您的 EXE 文件加载到内存的位置。您的 EXE 在其首选基址加载,通常为 400000 美元。从您拥有的地址中减去该值。您在地图文件中查找的地址是 $0000054a。