지난 며칠 동안 제 3자가 개발 한 데이터베이스 구성 요소에 이상한 문제가있었습니다. 이러한 구성 요소는 몇 달 동안 변경되지 않았습니다. 지난 며칠 동안 변경된 코드는 자체 코드이며 다른 제 3자가 개발 한 GUI 구성 요소도 업데이트했습니다. 내가 찾은 디버깅 후System.Move가 때로 잘못된 결과를 낼 수있는 원인은 무엇입니까?
은 데이터베이스 구성 요소의 절차 중 하나에 System.Move에 대한 호출은 occationaly 잘못된 결과를 준다!
하면 데이터베이스 구성 요소에서 아래의 코드를 살펴보고 내 의견을 읽어 보시기 바랍니다. 이 모순 된 행동은 어떻게 일어날 수 있습니까? 누구나이 일관성없는 행동의 원인을 찾기 위해 절차를 수행하는 방법에 대한 아이디어를 줄 수 있습니까? NB! 나는이 코드에 문제가 있다고 생각하지 않는다. 문제의 "증상"을 설명하기 위해서만 보여진다. 제 생각에 우리 코드 나 업데이트 된 gui-component-code로 인해 메모리 손상이나 무언가가 발생했습니다.
편집 : 아래에 링크 된 블로그 게시물을 살펴보십시오. 내 문제와 관련이있는 것 같습니다. http://blog.excastle.com/2007/08/28/delphi-bug-of-the-day-fpu-stack-leak/
편집 : 나는 그것을 읽고 적어도 그것은 System.Move 잘못된 결과를 줄 수있는 것을 확인 내 "솔루션"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 버전을 업그레이드했는지 여부를 포함시켜야합니다. 사람들이 귀하의 질문에 쉽게 답할 수있게 해줍니다. –
델파이 2007 for Win32입니다. 또한 FastMM4를 사용합니다. (내 질문이 아니지만 나는 그를 안다.) –
나는 나의 계정을 고쳤으며 나의 모든 대답을 나의 "대답"에서 옮기고 그 대답에 대한 진정한 논평을했다. –