最近几天我们遇到了第三方开发的数据库组件出现的一些奇怪的问题。几个月来,这些组件都没有发生变化。 最近几天改变了的代码是我们自己的代码,我们也更新了由另一个第三方开发的gui组件。什么会导致System.Move偶尔给出错误的结果?
调试后我发现在一个数据库组件过程occationaly中调用System.Move会给出错误的结果!
请从数据库组件中查看下面的代码并阅读我的评论。这种不一致的行为如何发生? 任何人都可以给我一个如何开始找到这种不一致行为的原因的想法吗? 注意!我不认为这个代码有什么问题,它只是用来解释问题的“症状”。 我的猜测是由于我们的代码或更新的gui组件代码导致某种内存损坏或某种情况。
编辑:看看下面链接的博客帖子。看起来这可能与我的问题有关。至少在我读它,它证实了System.Move可以给错误的结果: http://blog.excastle.com/2007/08/28/delphi-bug-of-the-day-fpu-stack-leak/
编辑: 对不起,不张贴我的“解决方案” earlyer但这里说到: 当使用德尔福2007年我的问题是通过使用替代System.Move的FastMove解决。 升级到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版本。它让人们更容易回答你的问题。 – 2009-09-23 18:33:49
它是Delphi 2007 for Win32。另外,我们使用FastMM4。 (这不是我的问题,但我认识他) – 2009-09-23 20:39:00
我已经修复了我的帐户,并将我所有的评论从我的“答案”中移除,并让他们对答案发表真实的评论。 – 2009-09-24 20:19:45