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

时间:2011-03-17 07:09:07

标签: delphi delphi-xe

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

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

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

运行时错误0040054A上的数字在mapfile中不存在。你知道这意味着什么吗?

任何人都可以告诉我如何找出引发错误的内容吗?

7 个答案:

答案 0 :(得分:4)

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

Delphi - Check if memory is being released "on time"

亲切的问候,弗兰克

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

有一个类似的问题,阅读: How to debug a crash that only occurs on application shutdown? (Delphi)

考虑使用Memory profiler,这有助于在应用终止后识别实时对象。

答案 4 :(得分:2)

我建议您尝试FastMM完全调试模式,并将其静态链接到您的应用程序,或将其用作程序包(如果您的应用程序使用程序包)。

答案 5 :(得分:0)

在Microsoft的官方web site中,有人提到,如果您的计算机感染了SubSeven特洛伊木马病毒,则会出现此问题。

防病毒软件和Windows注册表清理程序应该有所帮助。

答案 6 :(得分:0)

你可以使用我用来修复我的方法。

我注释掉了主程序,并添加了代码直到它失败。

事实证明它根本不想让我调用 couninitialize。当时没有抛出错误,但在程序终止后失败并返回 216。删除违规语句修复了它。

因为这可能是结束前的 6 个语句。声明,我认为这无关紧要。

如果您一致使用 // 进行注释,则此方法很简单。我将需要大括号的 IO 语句移到过程中。

相关问题