我在应用程序关闭时出现一个随机的运行时错误216。
我已尽可能调试,错误在 SysUtils.FinalizeUnits 中抛出。
我已经检查了代码并确保释放所有创建的对象。
运行时错误0040054A上的数字在mapfile中不存在。你知道这意味着什么吗?
任何人都可以告诉我如何找出引发错误的内容吗?
答案 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 语句移到过程中。