Delphi,FastMM - Block在被释放后已被修改 - 需要帮助解释此FastMM报告

时间:2013-11-03 18:33:44

标签: delphi memory-management delphi-2007 fastmm

当我从IDE运行它时,我的应用程序在退出时报告此错误。我通常会为程序运行时创建的每个线程实例获取一个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][System.@GetMem][645]
405F0D [UFlxNumberFormat.pas][System][System.@NewAnsiString][956]
4065E1 [APPGlobalDeclarations.pas][System][System.@LStrSetLength][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][System.@LStrClr][494]
406DD3 [APPGlobalDeclarations.pas][System][System.@FinalizeArray][3584]
406D5D [APPGlobalDeclarations.pas][System][System.@FinalizeRecord][3560]
406E38 [APPGlobalDeclarations.pas][System][System.@FinalizeArray][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][System.@Halt0][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] [System.TObject.Free] [12891] 困惑我我希望在这一点上可以调用Free,但GIFImage.pas在那里做什么?先前分配块的跟踪是完全随机的。这些项目都没有意义。 我觉得FastMM设置有些不对劲,或者FastMM从破坏的内存中获取堆栈跟踪。

我在使用Delphi 2006编译后最初遇到了这个问题.Delphi 2007的全新安装具有相同的行为。谁能告诉我发生了什么事? TIA [R

1 个答案:

答案 0 :(得分:1)

可能存在一些堆栈跟踪错误(例如错误的单元名称,或者某些完全不正确的行,您应该在整个堆栈跟踪上看起来更一般,并跳过不正确的单独行)

我猜你没有完全理解这个错误。 快速MM只检测到某些已释放的内存块被修改(它在应用程序退出时检测到这一点,但在块修改时没有检测到)

在这种情况下,堆栈跟踪只会显示何时分配块并取消分配但不是在修改时
寻找这种类型的错误是非常困难的,你必须找到内存损坏的地方,你可以使用FastMM内置程序来检查内存完整性(在大多数可疑内存操作后到处调用它)并祝你好运。