2013-11-03 139 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