我刚刚将我们的几个自制 Outlook COM 插件从 Delphi 2007 移植到 Delphi 2009,现在遇到了一些非常奇怪的错误(在你问之前:这些错误似乎都与字符串处理没有任何明显的关系),例如当一个人试图第二次调用它们时挂起 Outlook 的模态对话框(第一次似乎一切都很好),但只有当它们从一个特定的事件处理程序调用而不是在其他地方做同样的事情时才会挂起。当我将错误跟踪到特定的代码行并注释掉该行或用不同的代码替换它以达到相同的效果时(例如,通过将否则将通过函数直接调用的代码复制到调用站点),将出现错误走开——通常只是在以后再次出现一些(同样不显眼的)陈述。
在 Delphi 调试器中运行它时,我可以看到冻结通常在GetMem.inc
. 至少所有这些问题都是 100% 可重现的……
不用说我们在 Delphi 2007 中编译这些插件时没有这些问题。
现在,我很茫然。我知道我很幸运,但即使我认为自己是一个相当有经验的程序员(虽然主要是在小众领域),但我以前从未真正处理过这类错误。正如这个问题的标题所说,我什至不知道从哪里开始。我可以随心所欲地单步执行代码,但无休止的汇编语句对我来说毫无意义,而且我也不擅长有效地使用 CPU 视图。
此外,我什至不确定这是否是我自己的代码开始的问题(在这种情况下,我实际上倾向于怀疑它)。我们正在大量使用许多第三方库(例如 JCL、ADX、Redemption)。特别是 ADX 仍将其 Delphi 2009 支持标记为“测试版”。
我也尝试使用 FastMM 的 FullDebugMode 并且确实以这种方式在 ADX 中发现了一些错误(例如,在被释放后被修改的块)但是所有这些也发生在我使用 Delphi 2007 编译时,所以它似乎还不是必须的这些最终是观察到的回归的原因。
那么,我该如何处理呢?- 或者更好:我在哪里可以找到一些学习如何处理这个问题的好资源?例如,关于使用 CPU 视图的教程或有效解释和执行 FastMM 报告的教程?这些是正确的工具吗?我还应该去哪里看?
附录:
在这种情况下我应该怀疑哪些类型的代码?什么样的代码甚至有可能在内存中造成如此严重的破坏?我能想到的唯一地方是我的代码执行任何远程接近显式内存操作的地方是在准备 WinAPI 调用时保留一些缓冲区空间。还要记住,我的所有代码在 Delphi 2007 和 Delphi 2009 版本之间都是相同的,而 Delphi 2007 版本没有出现此类问题。
更新:
很有可能促使我发布这个问题的问题现在已经解决了。请参阅下面我自己的答案。