FastMM4,如何读取日志文件?

时间:2012-04-09 09:14:15

标签: delphi memory-leaks logging delphi-2006 fastmm

我正在开发一个软件,所以我刚开始在我的项目中使用FastMM4(真实的)。

我在网上找到了关于如何在FastMM4中获取line number,我得到了行号,但我可以弄清楚日志中的其他信息是什么意思?

我在日志文件中有这个

This block was allocated by thread 0x15F8, and the stack trace (return addresses) at     the time was:
402E86 [system.pas][System][System.@GetMem][2648]
403A3B [system.pas][System][System.TObject.NewInstance][8824]
403DAA [system.pas][System][System.@ClassCreate][9489]
403A70 [system.pas][System][System.TObject.Create][8839]
46A257 [u_home.pas][u_home][u_home.TForm1.SpeedButton1Click][80] {<-memory leak is here, but what are the Other detections?}
443AAC [Controls.pas][Controls][Controls.TControl.Click][5226]
46958B [Buttons.pas][Buttons][Buttons.TSpeedButton.Click][1211]
46956B [Buttons.pas][Buttons][Buttons.TSpeedButton.MouseUp][1204]
443FB2 [Controls.pas][Controls][Controls.TControl.DoMouseUp][5352]
441BA0 [Controls.pas][Controls][Controls.TControl.SetMouseCapture][4379]
444042 [Controls.pas][Controls][Controls.TControl.WMLButtonUp][5364]

The block is currently used for an object of class: TStringList

The allocation number is: 440

在此leak

   46A257 [u_home.pas][u_home][u_home.TForm1.SpeedButton1Click][80] {<-memory leak is here, but what are the Other detections?}

我的代码

 procedure TForm1.SpeedButton1Click(Sender: TObject);
  var
  str : TStringList;
  begin
  str := TStringList.Create;  {<--im not freeing the, so leak}

  end;

enter image description here

这是call stack enter image description here

我在网上搜索但我不知道其他检测是什么......

402E86 [system.pas][System][System.@GetMem][2648]
403A3B [system.pas][System][System.TObject.NewInstance][8824]
403DAA [system.pas][System][System.@ClassCreate][9489]
403A70 [system.pas][System][System.TObject.Create][8839]

{Other then this}
46A257 [u_home.pas][u_home][u_home.TForm1.SpeedButton1Click][80] {<-memory leak is here, but what are the Other detections?}
{Other then this}

443AAC [Controls.pas][Controls][Controls.TControl.Click][5226]
46958B [Buttons.pas][Buttons][Buttons.TSpeedButton.Click][1211]
46956B [Buttons.pas][Buttons][Buttons.TSpeedButton.MouseUp][1204]
443FB2 [Controls.pas][Controls][Controls.TControl.DoMouseUp][5352]
441BA0 [Controls.pas][Controls][Controls.TControl.SetMouseCapture][4379]
444042 [Controls.pas][Controls][Controls.TControl.WMLButtonUp][5364]

即时使用delphi 2006

我已经打开并在delphi 6, delph 7

中尝试了相同的操作

检查 我发现这与fastMM $ detectiong和已经在delphi中的一些泄漏的注册有关。 How to track down tricky memory leak with fastMM? 这是为了注册泄漏,但他们是错误吗? Using FastMM4, how to register leaked string?

另外FastMM4, Delphi6, Leak of TApplication?

are they just the steps leading to the memory leak?

2 个答案:

答案 0 :(得分:5)

日志中有一些调用堆栈导致内存分配泄露。

您可以在问题中看到它在调用堆栈中的用处。想象一下,你只有顶线,导致泄漏的电话

402E86 [system.pas][System][System.@GetMem][2648]

由于所有堆分配都通过GetMem,因此该信息本身几乎无用。调用堆栈指向导致GetMem调用的事件。这就是确定导致泄漏的原因。

答案 1 :(得分:4)

FastMM没有办法猜测代码背后的意图,并指出导致内存分配的指令应该有相应的指令来释放它。

请记住,FastMM仅记录在执行代码期间完成的所有内存分配 它不知道泄漏发生的原因,方式或位置,只是在应用程序关闭并且一切都应该干净的时候你没有释放这个特定的分配。

因此,当报告泄漏时,它实际上是一个显示的分配 FastMM不知道你的应用程序,只能在你分配内存的代码中显示导致这个特定点的整个调用链(通常是一个非常多的GetMem调用)。
通过上升阶段找到有意义的信息,直到找到需要一些内存的更高级别指令,如TButton.Create并查看该特定Button是否被释放(泄漏其所有内容),或者像TMyBadButton.Create创建一些AltBitmap但从不释放它 在一种情况下,泄漏是在应用程序代码中创建一个按钮而不释放它,在另一种情况下,它在TMyBadButton组件代码中。

<强>更新: 您可能会发现有用的旧CodeRage会话Memory Leaks for Dummies