4

私はソフトウェアに取り組んでいるので、プロジェクトで FastMM4 (実際に) を使い始めたばかりです。

line numberFastMM4 でを取得する方法についてネットで見つけました。行番号を取得しましたが、ログ内の他の情報が何を意味するかを理解できますか?

私はこれをログファイルに持っています

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 $ の検出と、すでに Delphi にあるいくつかのリークの登録に関連していることを確認しました。 fastMMでトリッキーなメモリリークを追跡する方法は? これはリークを登録するためのものですが、バグですか? FastMM4 を使用して、漏洩した文字列を登録する方法は?

また、FastMM4、Delphi6、TApplication のリーク?

またare they just the steps leading to the memory leak?

4

2 に答える 2

6

ログにあるのは、リークしたメモリ割り当ての原因となったコール スタックです。

質問のコール スタックで、それがどれほど役立つかを確認できます。一番上の行、つまりリークの原因となった通話しかないと想像してください。

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

すべてのヒープ割り当てが通過するため、その情報自体はほとんど役に立ちませんGetMem。への呼び出しに至るまでのイベントを示すのは、呼び出し履歴GetMemです。そして、それが漏れの原因を特定するものです。

于 2012-04-09T10:38:28.807 に答える
5

FastMM には、コードの背後にある意図を推測する方法がなく、メモリ割り当てを引き起こしている命令がメモリを解放するための対応する命令を持っている必要があることを特定する方法はありません。

FastMM は、コードの実行中に行われたすべてのメモリ割り当ての記録のみを保持することに注意してください。
アプリケーションがシャットダウンした時点でこの特定の割り当てが解放されておらず、すべてがクリーンである必要があるというだけで、リークが発生する理由、方法、場所はわかりません。

したがって、リークが報告された場合、実際に表示されるのは割り当てです。
FastMM はアプリケーションを認識せず、メモリを割り当てるコード内のこの特定のポイント (通常は膨大な数の GetMem 呼び出しの 1 つ) につながる呼び出しチェーン全体を表示することしかできません。
意味のある情報は、はしごを上って、TButton.Create特定のボタンが解放されたかどうか (すべてのコンテンツをリークする) のようにメモリを必要とするより高いレベルの命令が見つかるまで、またはTMyBadButton.CreateAltBitmap を作成する a のように見つけることができますが、解放することはありません。
リークは、ボタンを解放せずにボタンを作成するアプリケーションコードにある場合と、TMyBadButtonコンポーネントコードにある場合があります。

更新: この古い CodeRage セッションのMemory Leaks for Dummiesが役に立つかもしれません

于 2012-04-09T17:53:57.253 に答える