【发布时间】:2018-10-06 19:27:36
【问题描述】:
最近几天,我们在使用第三方开发的数据库组件时遇到了一些奇怪的问题。几个月来,这些组件没有任何变化。 最近几天更改的代码是我们自己的代码,我们还更新了由另一个第三方开发的 gui 组件。
调试后我发现在其中一个数据库组件过程中调用 System.Move 有时会给出错误的结果!
请从数据库组件中查看下面的代码并阅读我的 cmets。这种不一致的行为怎么会发生? 谁能告诉我如何继续找到这种不一致行为的原因? 注意!我不认为这段代码有什么问题,它只是用来解释问题的“症状”。 我的猜测是由于我们的代码或更新的 gui-component-code 导致某种内存损坏或其他原因。
编辑:查看下面链接的博文。看来这可能与我的问题有关。至少当我读到它确认 System.Move 可以给出错误的结果: http://blog.excastle.com/2007/08/28/delphi-bug-of-the-day-fpu-stack-leak/
编辑: 很抱歉没有早点发布我的“解决方案”,但它来了: 使用 Delphi 2007 时,我的问题通过使用 FastMove 替换 System.Move 解决了。 升级到 Delphi 2010 后,我还没有遇到这个问题,我们不再使用 FastMove。
Procedure InternalDescribe;
var
cbufl: sb4; //sb4=LongInt
cbuf: array[0..30] of char;
cbufp: PChar;
//....
begin
//..Some code
repeat
//...Some code to initialize cbufp and cbufl
//On the 15. iteration the values immediately Before Move are always these:
//cbufp = 'STDPRODUCTSTOREDELEMENTSCOUNT'
//cbuf = ('S', 'T', 'A', 'T', 'U', 'S', #0, 'E', 'V', 'A', 'R', 'R', 'E', 'C', 'I', 'D', #0, 'D', 'U', 'C', 'T', 'I', 'D', #0, #0, #0, #0, #0, #0, #0, #0)
//cbufl = 29
Move(cbufp^, cbuf, cbufl);
//Values immediately After Move should then be:
//cbuf = ('S', 'T', 'D', 'P', 'R', 'O', 'D', 'U', 'C', 'T', 'S', 'T', 'O', 'R', 'E', 'D', 'E', 'L', 'E', 'M', 'E', 'N', 'T', 'S', 'C', 'O', 'U', 'N', 'T', #0, #0)
//But sometimes this Move results in this value( 1 in 5..15 times):
//cbuf = ('S', 'T', 'D', 'P', 'R', 'O', 'D', 'U', 'C', 'T', 'S', 'T', 'O', 'R', 'E', 'D', #0, #0, #0, #0, #0, 'N', 'T', 'S', 'C', 'O', 'U', 'N', 'T', #0, #0) }
until SomeCondition;
//...Some more code
end;
【问题讨论】:
-
您确实应该包括您正在使用的 Delphi 版本,以及您最近是否升级了您的 Delphi 版本。它使人们更容易回答您的问题。
-
这是用于 Win32 的 Delphi 2007。此外,我们使用 FastMM4。 (这不是我的问题,但我认识他)
-
我现在已经修复了我的帐户,并将我的所有 cmets 从我的“答案”中移出,并将它们变成了真正的 cmets。
标签: delphi