Delphi:关闭应用程序时如何调试访问冲突?

时间:2011-10-10 16:09:50

标签: delphi access-violation

我正在使用Delphi 6,我有一个应用程序,在关闭时会产生访问冲突错误。我们使用EurekaLog,因此我得到用于调试的堆栈跟踪,但错误似乎每次都在不同的单元中随机出现,但总是在 finalization 部分中释放某些内容时。

如何进行调试以查看导致问题的原因?我不确定如何开始调试应用程序最终确定时发生的事情。

[编辑:] 很抱歉,如果我不清楚,或许更好的问题是:如果我只想完成最终确定部分,那么开始使用断点进行调试的最佳位置是什么?这些错误似乎出现在我们使用的第三方组件(devexpress dx / cxgrid库)中,所以我想在Delphi开始调用其他单元中的finalize例程之前的最后一点开始在我的代码中进行调试。

2 个答案:

答案 0 :(得分:4)

这不是很多,但如果我不得不猜测,根据过去的经验...你使用的是包还是COM库?如果你有一个接口的全局变量,或者在BPL中声明其类的对象,并且在清理对象/接口之前卸载DLL / BPL,那么你将会遇到访问冲突,因为你的代码试图在不再映射到应用程序的地址空间中执行VMT查找。

检查并确保在终结开始之前清理所有这些变量。

答案 1 :(得分:-3)

当应用程序关闭时,请不要在完成部分中释放任何内容。

1)当应用程序关闭时,Windows释放所有应用程序内存。你不必那样做。

2)当应用程序关闭时,内存将被释放,基础架构将被卸载。您无法调用代码来关闭或释放对象,因为该代码可能已被卸载。您无法访问指向内存的指针,因为这些指针可能已经被释放。

3)当您在应用程序关闭时尝试释放完成部分中的内容时,您可能会遇到阻止代码完成的故障,从而阻止应用程序关闭,导致应用程序挂起和内存丢失。这首先是你想要防止的。不要这样做。

好的,当您在Win95 / 98上运行或使用外部进程时,在某些情况下,您可能必须释放共享资源并通知您正在关闭的外部进程。除此之外,这一切现在都是自动发生的。