FastMM4,如何读取日志文件?(FastMM4, how to read the log fil

2019-09-16 09:58发布

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

我已经在网上找到关于如何获得line number在FastMM4,我得到了行号,但我可以找出哪些呢日志手段的其他信息?

我有这个日志文件

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;

这里是call stack

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

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以及一些泄漏这已经是德尔福的注册。 如何跟踪与fastMM棘手的内存泄漏? 这对于注册泄漏,但他们的错误? 使用FastMM4,如何注册泄露的字符串?

此外FastMM4,Delphi6的,TApplication的的泄漏?

或者are they just the steps leading to the memory leak?

Answer 1:

你必须在日志中有什么是导致该泄漏的内存分配调用堆栈。

你可以看到它是在你的问题的调用堆栈是多么有用。 试想一下,你只用了顶线,这导致泄漏通话

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

对自己的信息几乎是无用的,因为所有的堆分配经历GetMem 。 它是指向你那导致了调用事件调用堆栈GetMem 。 而这正是查明是什么原因造成的泄漏。



Answer 2:

FastMM没有办法猜测的代码背后的意图,并查明该指令引起内存分配应该有一个相应的指令,以释放它。

请记住,只有FastMM让你的代码的执行过程中做了所有的内存分配的记录。
它不知道是什么原因,如何或在泄漏发生,只是当你的应用程序关闭,一切都应该是干净的,你还没有释放在这个特殊的分配。

所以,当报告泄露,实在是所显示的分配。
FastMM不知道你的应用程序,只能说明整个呼叫链,你分配内存(通常是一个极大的getmem调用之一)导致此特定点的代码。
有意义的信息可以通过一个上升的阶梯找到,直到找到需要的一些记忆,就像一个上级指令TButton.Create ,看看是否有特定的按钮被释放或没有(泄漏的所有内容),或像TMyBadButton.Create其中产生了一些AltBitmap但从来没有将其释放。
在一种情况下的泄漏发生在应用程序代码creainge一个按钮而不释放它,在另一种情况下,它是在TMyBadButton分量代码。

更新 :您可能会发现有用的这个老CodeRage会议傻瓜内存泄漏



文章来源: FastMM4, how to read the log file?