最近几天,我们遇到了由第三方开发的数据库组件的一些奇怪问题.几个月来这些组件一直没有变化.HAS最近几天更改的代码是我们自己的代码,我们还更新了由另一个第三方开发的gui组件.
调试后我发现在其中一个数据库组件过程中调用System.Move偶尔会给出错误的结果!
请从数据库组件中查看以下代码并阅读我的评论.这种不一致的行为怎么会发生?谁能让我知道如何找到这种不一致行为的原因?NB!我不认为这个代码有什么问题,它只能解释问题"症状".我的猜测是,由于我们的代码或更新的gui-component代码导致存在某种内存损坏或其他问题.
编辑:看看下面链接的博客帖子.它似乎与我的问题有关.至少当我读到它时,它确认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;
Run Code Online (Sandbox Code Playgroud)
移动不会给出错误的结果,或者至少我从未见过它的任何情况.你更有可能在缓冲区中遇到意想不到的东西.尝试在此例程中添加对Windows.OutputDebugString的调用,以查看您之前和之后要复制的内容.
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |