2013-11-03 3 views
2

IDE에서 실행할 때 내 앱에서 종료 할 때이 오류가보고됩니다. 보통 프로그램이 실행되는 동안 만들어진 스레드의 각 인스턴스에 대해 하나의 FastMM 걸림돌을 얻지 만이 동작을 특성화하기에 충분히 반복 할 수는 없습니다. 문제는 내가 보고서를 이해할 수 없다는 것입니다.Delphi, FastMM - 해제 된 후 블록이 수정되었습니다. - FastMM 보고서 해석에 도움이 필요합니다.

--------------------------- 
APP.exe: Memory Error Detected 
--------------------------- 
FastMM has detected an error during a free block scan operation. FastMM detected that a block has been modified after being freed. 

The previous block size was: 40 

Stack trace of when this block was previously allocated (return addresses): 
403052 [APPHardwareDeclarations.pas][System][[email protected]][645] 
405F0D [UFlxNumberFormat.pas][System][[email protected]][956] 
4065E1 [APPGlobalDeclarations.pas][System][[email protected]][3356] 
411AF7 [madStrings][madStrings.WideToAnsiEx] 
41ACE8 [madTools][madTools.FindModule] 
720074 [RpRenderCanvas][RpRenderCanvas.TRvRenderCanvas.FloodFill] 
720074 [RpRenderCanvas][RpRenderCanvas.TRvRenderCanvas.FloodFill] 
780065 [UXlsReferences][UXlsReferences.TReferences.SaveToStream] 
4AAB2E [ExtCtrls][ExtCtrls.TTimer.Timer] 

Stack trace of when the block was previously freed (return addresses): 
405E59 [APPSendEmailSMTPQueue.pas][System][[email protected]][494] 
406DD3 [APPGlobalDeclarations.pas][System][[email protected]][3584] 
406D5D [APPGlobalDeclarations.pas][System][[email protected]][3560] 
406E38 [APPGlobalDeclarations.pas][System][[email protected]][3602] 
47B6F2 [Classes][Classes.TStringList.Destroy] 
404DFF [GIFImage.pas][System][System.TObject.Free][12891] 
468741 [SysUtils][SysUtils.FreeAndNil] 
506600 [StringUtilities][StringUtilities.AddCommaTextPair] 
85C738 [APPLogWebTransactionsQueue][APPLogWebTransactionsQueue.ServiceWebTransactionQueue] 

The current stack trace leading to this error (return addresses): 
40D04C [FastMM4][FastMM4.CheckBlocksOnShutdown] 
40DE88 [FastMM4][FastMM4.Finalization] 
4059F3 [GraphicEx.pas][System][System.FinalizeUnits][8123] 
458CAA [madExcept][madExcept.InterceptFinalizeUnits] 
405CCB [IdCoderXXE.pas][System][[email protected]][85] 
924868 
7C90DCBA [ZwSetInformationThread] 
7C81776F [RegisterWaitForInputIdle] 
7C817778 [RegisterWaitForInputIdle] 

Current memory dump of 256 bytes starting at pointer address 16902788: 
6C 6A 95 00 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 
80 80 80 80 80 80 80 80 D7 D8 6F E9 80 80 80 80 80 80 00 00 41 1E 90 16 00 00 00 00 00 00 00 00 
00 00 00 00 52 30 40 00 9B 4D 40 00 11 82 40 00 62 51 40 00 E2 5B 64 00 21 76 64 00 68 77 64 00 
12 B0 64 00 AD D6 64 00 6E 30 40 00 B9 4D 40 00 AD 51 40 00 6A 5C 64 00 78 82 40 00 78 35 64 00 
83 81 40 00 48 6E 40 00 5D 6D 40 00 28 00 00 00 04 44 64 00 C0 27 90 16 6C 6A 95 00 80 80 80 80 
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 
3F D8 6F E9 80 80 80 80 00 00 00 00 40 FF 8F 16 00 00 00 00 00 00 00 00 00 00 00 00 52 30 40 00 
0D 5F 40 00 E1 65 40 00 F7 1A 41 00 E8 AC 41 00 74 00 72 00 74 00 72 00 65 00 78 00 2E AB 4A 00 
l j • . € € € € € € € € € € € € € € € € € € € € € € € € € € € € 
€ € € € € € € € × Ø o é € € € € € € . . A . . . . . . . . . . 
. . . . R 0 @ . › M @ . . ‚ @ . b Q @ . â [ d . ! v d . h w d . 
. ° d . ­ Ö d . n 0 @ . ¹ M @ . ­ Q @ . j \ d . x ‚ @ . x 5 d . 
ƒ @ . H n @ . ] m @ . ( . . . . D d . À ' . l j • . € € € € 
€ € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € 
? Ø o é € € € € . . . . @ ÿ . . . . . . . . . . . . . R 0 @ . 
. _ @ . á e @ . ÷ . A . è ¬ A . t . r . t . r . e . x . . « J . 

이전에 항목이 해제되었을 때의 스택 추적을 취하십시오.

468741 [SysUtils][SysUtils.FreeAndNil] 
506600 [StringUtilities][StringUtilities.AddCommaTextPair] 
85C738 [APPLogWebTransactionsQueue][APPLogWebTransactionsQueue.ServiceWebTransactionQueue] 

모든 합리적이지만, 다음 줄 : 404DFF [GIFImage.pas] [시스템] [System.TObject.Free] [12891] 나 퍼즐. 이 시점에서 Free가 호출 될 것으로 기대되지만, GIFImage.pas은 무엇입니까? 블록이 이전에 할당되었을 때의 추적은 완전히 무작위입니다. 어떤 항목도 의미가 없습니다. FastMM 설정으로 뭔가 이상하다고 느끼거나 FastMM이 휴지통 메모리에서 스택 추적을 가져 오는 중입니다.

원래 Delphi 2006로 컴파일 한 후에이 문제가있었습니다. Delphi 2007의 완전히 새로운 설치는 동일한 동작을합니다. 아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있니? TIA R

+1

호기심이 없습니다. 프로젝트에서 madExcept를 제거하면 같은 일이 발생합니까? – TLama

+0

메모리 블록을 해제 한 다음 나중에 액세스했습니다. –

+0

나는 FastMM이 제공 한 덤프가 왜 필자가 이유를 찾는데 사용할 수있는 합리적인 정보를 제공하지 않는다는 것을 알고있다. – rossmcm

답변

1

(잘못된 단위 이름처럼, 또는 완전히 잘못된 라인, 당신은 전체 스택 추적에 대한 일반적인보고 잘못된 개별 라인을 건너 뛰어야) 일부 스택 추적 오류 내가 당신에게 돈을 생각

을있을 수 있습니다 이 오류를 완전히 이해하지 못했습니다. 빠른 MM은 블록이 할당 을 해제 할 때 해제 된 메모리의 일부 블록 (하지만 블록 변경의 순간에,이 응용 프로그램 종료에이를 감지하는)이 경우

스택 트레이스가 당신을 보여 수정 된 것을 감지 그러나 변경된 때 아닙니다.
이 유형의 오류에 대한 헌팅은 매우 어렵습니다. 메모리가 손상된 곳을 찾아야합니다. FastMM 내장 프로 시저를 사용하여 메모리 무결성을 확인하고 (가장 의심스러운 메모리 작업 이후에 어디에서나 전화를 걸 수 있습니다) 행운을 빕니다.

+0

의견을 보내 주셔서 감사합니다. FastMM이보고 한 사항에 감사 드리며, 해제 될 때 메모리를 알려진 패턴으로 채우고 나중에 바이트가 수정되었는지 검사합니다. 스택 추적이 의미가있는 경우 버그를 찾을 수있는 기회가 훨씬 많습니다. – rossmcm

관련 문제