Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:关闭应用程序时如何调试访问冲突?_Delphi_Access Violation - Fatal编程技术网

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

Delphi:关闭应用程序时如何调试访问冲突?,delphi,access-violation,Delphi,Access Violation,我使用的是Delphi6,我有一个应用程序,当它关闭时会产生访问冲突错误。我们使用EurekaLog,因此我得到了用于调试的堆栈跟踪,但是每次错误似乎都随机出现在不同的单元中,但总是在finalization部分释放某些内容时发生 如何进行调试以查看问题的原因?我不知道如何开始调试应用程序完成时发生的事情 [编辑:如果我不清楚,很抱歉,也许更好的问题是:如果我只想浏览最终确定部分,那么从哪里开始调试断点是最好的?这些错误似乎出现在我们使用的第三方组件(devexpress dx/cxgrid库)

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

如何进行调试以查看问题的原因?我不知道如何开始调试应用程序完成时发生的事情


[编辑:如果我不清楚,很抱歉,也许更好的问题是:如果我只想浏览最终确定部分,那么从哪里开始调试断点是最好的?这些错误似乎出现在我们使用的第三方组件(devexpress dx/cxgrid库)中,因此我想在Delphi开始调用其他单元中的Finalize例程之前的最后一点开始调试我的代码。

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


检查并确保在“终结”开始之前清除所有此类变量。

当应用程序关闭时,不要释放“终结”部分中的内容

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

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

3) 当您试图在应用程序关闭时释放finalization部分中的内容时,可能会出现阻止代码完成的故障,从而阻止应用程序关闭,从而导致应用程序挂起和内存丢失。这就是你一开始想要阻止的。不要这样做


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

调试与正常一样。如果在RTL/VCL单元中出现AV,则可能需要使用调试DCU。在“终结”部分中设置断点,然后逐步执行。事实上,您并不需要设置断点,只需在调试器下运行并安排异常触发断点即可。FastMM内存管理器也是跟踪内存泄漏的非常有用的工具。你们有很多表格吗?在调用Application.Run之后,尝试从.dpr文件中释放这些文件。看看这是否有帮助。如果你让应用程序这么做,那么你可能会遇到一些复杂的VCL错误(但我不确定它们会延伸到D6)。@David你有关于这些错误的更多信息或链接吗?我最近调试了一些情况,在这些情况下,这可能起到了一定的作用……我在qc报告中加入了。我记不起电话号码了。搜索我的名字会得到它。虽然这个响应给出了一个建议,说明什么样的更改可能会使问题消失,但它并没有真正回答如何调试的问题。您使用了什么技术来确定问题出在全局接口变量上?@Rob:大量设置断点,点击F7和F8,并密切关注发生了什么。我上次遇到这个问题是在D2010上,在他们开始发布系统DCP的调试版本之前。相信我,这一点都不好玩。@Rob:除了它建议关注什么,我同意梅森过去的经验,COM对象可以对你这样做。@MasonWheeler谢谢-我已经更新了一点这个问题。在我编写的代码中,我没有使用包或COM库,但我使用的是第三方组件,我不确定。