【问题标题】:AV after successful close of applications成功关闭应用程序后的 AV
【发布时间】:2012-03-10 06:55:10
【问题描述】:

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

模块 rtl160.bpl 中的异常 EAccessViolation 位于 00073225。模块“rtl160.bpl”中地址 500A3225 的访问冲突。读取地址 00000004。

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

这些应用程序是从 Delphi-xe 移植而来的,它们可以完美运行很长时间。港口项目没有变化。 32 位和 64 位版本的结果相同。

这是某个库的终结部分释放资源或其他什么的错误吗?

我正在使用 Delphi-XE2 更新 3。

不胜感激。

【问题讨论】:

  • 好像没有人对这个问题感兴趣。任何看到问题的人都可以告诉我他们为什么不发表评论或尝试回答吗?
  • 如果没有您的应用程序,这是一个非常难以回答的问题。对于我经历过的导致类似的事情,我只能给出一些指示。
  • 关于内存问题的好文章:eurekalog.blogspot.com/2010/03/…
  • 我的应用程序使用动态包,这些包是使用LoadPackage 函数加载的。每次我遇到这样的错误时,我总是通过重建所有项目来解决错误。

标签: delphi delphi-xe2


【解决方案1】:

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

我不确定是什么原因造成的,因为它在 Borland 库代码中如此之深,但是当代码更改时,它似乎来来去去都是随机的。而且它似乎更常见于多表单应用程序。

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

现在,我只是将新按钮留在表单上,​​将其设置为“不可见”,这样就没有可见的变化。由于它似乎有效,目前对我来说已经足够好了。

【讨论】:

    【解决方案2】:

    访问冲突本质上已经是非常麻烦的事情,因为它们会处理内存中的无效指针。在应用程序关闭一段时间后发生的情况更糟,因为那是您的应用程序处于“清理”模式的时候。您可能正在处理应用程序早期出现的问题,但仅在关闭时才暴露出来。

    一般提示:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        • 2020-05-01
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多