成功关闭申请后的AV

时间:2012-02-19 19:42:40

标签: delphi delphi-xe2

我在应用程序按预期关闭后大约3到5秒收到此AV消息:

模块rtl160.bpl中的EAccessViolation异常为00073225.模块'rtl160.bpl'中地址为500A3225的访问冲突。读取地址00000004。

这些(20)应用程序非常相似,因为它们是IBX业务应用程序。其中大约一半没有导致AV发生。

这些应用程序是从Delphi-xe移植而来的,并且它们在很长一段时间内都运行良好。没有对港口的项目进行任何更改。 32位和64位构建都给出了相同的结果。

这是某个库的终结部分中的一个错误,是否释放了某个资源?

我正在使用Delphi-XE2 Update 3.

非常感谢帮助。

3 个答案:

答案 0 :(得分:3)

尝试使用madExcept / EurekaLog等 - 它们会在AV上为您提供详细的堆栈跟踪。这并不总是灵丹妙药,但可以指出你的问题。

答案 1 :(得分:3)

访问违规本质上已经是非常麻烦的野兽,因为它们处理内存中的无效指针。应用程序关闭后发生一段时间的情况甚至更糟,因为当您的应用程序处于“清理”模式时。你可能正在处理应用程序早期出现问题的东西,但只是在关机时暴露自己。

一般提示:

  • 尝试始终按照您执行的相反顺序撤消操作。例如。
    • 创建A,创建B ...销毁B,销毁A
    • 连接数据库,打开数据集...关闭数据集,断开数据库连接
  • 即使确保在关闭之前完成上述所有操作也会有很大帮助。
  • 在应用程序运行时仍在运行的任何线程都可能导致问题。
    • 最好在最终关闭之前确保所有子线程都已正确终止。
    • 请参阅上面的Closing数据集。根据您正在做的事情,一些数据库组件将创建自己的线程。
  • 如果您正在使用COM,请尝试确保ComObj在初始化序列中处于高位(即,将其置于DPR中尽可能高)。
    • Delphi按照初始化的相反顺序完成单位。
    • 你不希望ComObj在依赖ComObj的其他东西之前完成。
  • 如果您使用接口引用,请确保解决循环引用问题。
  • 其中一些问题可能很难找到,但您可以执行以下操作:
    • 设置源代码“沙盒”环境(一旦发现问题,您将立即查看所有更改)。
    • 找出保证错误所需的最简单的步骤。 (启动应用程序并立即关闭将是理想的。)
    • 然后你要评论删除删除测试之间的代码块,基本上遵循分而治之的方法:
      • 删掉代码
      • 测试
      • 如果问题仍然存在,请重复。否则回滚并撕掉不同的代码块。
    • 最终,您的代码库将足够小,可以查明可能通过目标测试解决的问题。

答案 2 :(得分:0)

我在旧的Delphi或C ++ Builder项目中偶尔会遇到这种访问冲突问题。今天我用C ++ Builder了。在崩溃时,通过查看Debug - >调用堆栈窗口,我可以看到它发生在fflush的调用中,由__exit_streams和_exit调用。

我不确定是什么导致它,因为它在Borland库代码中如此之深,但是当代码发生变化时它似乎随机出现。对于多表单应用程序来说似乎更常见。

这次,当我刚刚在主窗体上添加了一个新按钮时,错误就消失了。一个按钮就在那里,没有事件处理程序,也没有做任何事情。我认为,当您重新链接应用程序时,代码,类,变量等的任何随机更改都会重新排列内存布局,并且会触发或触发错误。

现在,我只是在表单上保留新按钮,将其设置为“不可见”,这样就没有明显的变化。因为它似乎有效,所以此时它对我来说已经足够好了。