gpt4 book ai didi

delphi - 如何在 Delphi 中找到导致 AV 的悬空接口(interface)

转载 作者:行者123 更新时间:2023-12-03 14:39:14 24 4
gpt4 key购买 nike

我有一个复杂的应用程序,我刚刚对其进行了一些更改,添加了几个带有接口(interface)的新类并删除了其他一些类。从功能上讲,它一切正常,但在类的 Destroy 过程之后我遇到了访问冲突:

“模块‘xxxx.exe’中地址 0040B984 处发生访问冲突。读取地址 80808088”。

我知道这是在类的“Finalize”代码中,并且如果我进入反汇编(Delphi 2010),我肯定可以看到 AV 的要点。不过,我看不到一种简单的方法来找出哪个变量触发了这个问题。当进行如此深入的研究时,是否需要遵循一个程序来让我了解所引用的实例?

谢谢布赖恩

最佳答案

此错误看起来像是您正在使用 FastMM 进行内存管理。该错误表明您引用的指针已被 FastMM 使用 DebugFillDWord 值清除。

这意味着您正在使用一个引用已释放对象的接口(interface)。
这也意味着您尚未启用 CatchUseOfFreedInterfaces

为了更改这些并进行调试,您无法使用 Delphi 附带的 Stock FastMM。
您需要下载FastMM (4.94 版)。

下载后:

喜欢gabr已经提到,在 FastMM4Options.inc 中,确保启用 FullDebugModeCatchUseOfFreedInterfaces (这会禁用 CheckUseOfFreedBlocksOnShutdown,但是您现在对后者不感兴趣)。
您可能还想启用RawStackTraces;这取决于您当前的堆栈跟踪是否足够好。

完成这些设置后,然后通过调试器使用 FastMM 运行您的应用,并在 FastMM4 单元内的该方法上放置一个断点:

procedure TFreedObject.InterfaceError;

我对我的 FastMM4 单元进行了一些修改,以获得更多上下文信息;我可以与您分享(我已经将其邮寄给 FastMM4 团队,但尚未包含在官方来源中)。

我写了一个相当密集的blog article on debugging using FastMM这可能对你有帮助。
如果需要进一步解释,请在此处留言:-)

祝你好运,如果您需要进一步的指导,请告诉我们。

--杰罗恩

编辑:20100701 - 强调了 Brian 评论中提到的内容。

关于delphi - 如何在 Delphi 中找到导致 AV 的悬空接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3139344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com