FastMM 4.92 FAQ

よくある質問
:
------------------------

Q: プログラムをシャットダウンすると、FastMM がメモリ リークを報告します。 Q
: プログラムを閉じると、FastMM はプログラムにメモリ リークがあると報告します。FastMM で何か問題が発生した可能性はありますか。
A: 残念ながら、いいえ。FastMM がブロックのリークを報告した場合、ブロックは割り当てられたが解放されなかったため、リークが発生したことを意味します。問題の原因をさらに解明するには、FullDebugMode を使用できます。Q

: FullDebugMode オプションを有効にすると、起動中にアプリケーションがクラッシュします。何が問題ですか?
Q: FullDebugMode オプションを有効にすると、起動中にプログラムがクラッシュします。何が悪かったのか?
A: FullDebugMode には FastMM_FullDebugMode.dll ライブラリが必要です。アプリケーションと同じフォルダー内にあるか、パス上でアクセスできることを確認してください。

Q: 「FullDebugMode」でメモリ エラーが発生した場合、スタック トレースにはデバッグ情報はなく、アドレスのみが表示されます。なぜ?
问:
A: FastMM_FullDebugMode.dll ライブラリがスタック トレースのユニット/行番号情報を決定するには、TD32 デバッグ情報、.map ファイル、.jdbg ファイル、または埋め込み JCL デバッグ情報のいずれかが使用可能である必要があります。これらのいずれも利用できない場合は、スタック トレース内のアドレスのみを取得します。行番号を表示するには、「デバッグ情報」、「参照情報」、および「デバッグ DCU の使用」を有効にする必要もあります。また、アドレスがシャットダウン前にアンロードされた動的にロードされた DLL 内にある場合、FastMM はそれらのユニット/行番号情報を判断できません。

Q: FullDebugMode を有効にして、メモリ リークのスタック トレースを含むログ ファイルを取得しましたが、行番号はありません。なぜ?
A: 行番号を取得するには、[プロジェクト オプション] ダイアログの [コンパイラ] タブで [デバッグ情報]、[参照情報]、および [デバッグ DCU の使用] を有効にする必要もあります。

Q: 私のプログラムは Borland メモリ マネージャーでは正常に動作していましたが、FastMM では「無効なポインター操作」または「アクセス違反」が発生します。FastMM にバグはありますか?
A: 可能性は非常に低いです。メモリ マネージャーはプログラムにとって非常に重要な部分であり、大量のトラフィックにさらされるため、この種のバグがテストを通過することはほとんどありません。FastMM はデフォルトのメモリ マネージャーとは動作が異なり、より多くのポインター チェックを行うため、より多くのエラーをキャッチします。例: デフォルトの MM では同じポインタを 2 回解放できますが、FastMM ではそうしようとするとすぐに「無効なポインタ操作」が発生します。FastMM4.pas で設定された「FullDebugMode」オプションを使用してアプリケーションをコンパイルします。これにより、問題の原因に近いエラーが発生するはずです。

Q: 私のプログラムは置換メモリ マネージャー X で動作していましたが、FastMM を使用しようとするとアクセス違反が発生します。なぜ?
A: ソースのどこかに古いメモリ マネージャーへの参照が残っている可能性があります。「ファイル内検索」を実行し、古いメモリ マネージャーが「uses」句で参照されていないことを確認します。FastMM は、それが最初にインストールされるメモリ マネージャであることをチェックしますが、他の多くのメモリ マネージャはチェックしないため、FastMM の後に別の MM がインストールされる可能性が十分にあります。

Q: FastMM を使用してもプログラムは高速化されません。どうしたの?
A: プログラムがメモリの割り当てと解放にあまり時間を費やさない場合、FastMM で速度を上げるためにできることはほとんどありません。例: アプリケーションがデフォルトのメモリ マネージャーを使用してメモリを割り当てるのに時間の 1% しか費やしていない場合、非常に高速なメモリ マネージャーによって高速化できるのはせいぜい 1% です。FastMM は、Delphi 2005 (および古い Delphi バージョン) のデフォルトのメモリ マネージャーよりもはるかに高速ですが、プログラムのボトルネックがメモリ管理ではない場合、期待したほどの効果は得られない可能性があります。

Q: FastMM4.pas をプロジェクトの .dpr ファイルの最初のユニットとして追加しましたが、プログラムを実行しようとすると、これが最初のユニットではないというメッセージが表示されます。なぜ?
A: ユニットの初期化順序を変更する例外ハンドラー (MadExcept や EurekaLog など) を使用している場合は、FastMM が最初に初期化されるように構成を変更する必要があります。

Q: デフォルトの borlndmm.dll を FastMM DLL に置き換えると、Delphi 2005 がクラッシュし、「クラス 'TApplication'、すでにクラス マップである」というエラー メッセージが表示されます。なぜ?
A: これは、Delphi 2005 のバグ (QC#14007) が原因です。これを修正する非公式パッチが利用可能です。詳細については、FastMM4_Readme.txt を参照してください。

Q: 代替の borlndmm.dll を Delphi IDE と一緒に使用しています。Delphi のコピーを 2 つ開き、もう 1 つを閉じると、メモリ リーク レポートが表示されます。なぜ?
A: DLL をコンパイルするときは、「NeverUninstall」オプションを設定する必要があります。

Q: 代替の borlndmm.dll を Delphi 2005 IDE と一緒に使用しています。IDEを閉じるとタスクマネージャーに残ります。なぜ?
A: これはバグ (QC#14070) が原因です。DLL をコンパイルするときに、これを回避するには「NeverUninstall」オプションを設定する必要があります。

Q: 私のプログラムは以前は正常に動作していましたが、「FullDebugMode」を有効にして実行すると、アドレス $8080xxxx でアクセス違反が発生します。なぜ?
A: 解放されたオブジェクトのプロパティにアクセスしようとしています。「FullDebugMode」でブロックを解放すると、FastMM は解放されたメモリ領域を $80 バイトのパターンで埋めます。解放されたオブジェクト内にポインター、長い文字列、またはオブジェクト参照があった場合、それらは予約されたアドレス空間にある $80808080 を指すようになります。

Q: 「FullDebugMode」でエラーが発生すると、スタック トレースが非常に不完全になります。なぜ?
A: おそらく「RawStackTraces」オプションが無効になっていると思われます。このオプションが設定されていない場合、FastMM はスタック フレームを設定するルーチンのスタック トレースのみを行うことができます。[コンパイラ] タブの [プロジェクト オプション] ウィンドウで、[スタック フレーム] オプションを有効にして、すべてのプロシージャのスタック フレームを作成します。通常、「RawStackTraces」オプションを使用すると、より完全なスタック トレースが生成されますが、スタック トレースに (避けられない) 「誤ったアラーム」エントリがさらに追加される可能性があることに注意してください。

Q: DLL とメイン アプリケーション間で長い文字列と動的配列を安全に受け渡すことができるように、FastMM を共有するにはどうすればよいですか?
A: 最も簡単な方法は、FastMM4.pas で ShareMM、ShareMMIfLibrary、および AttemptToUseSharedMM を定義し、メイン アプリケーションと DLL の両方の .dpr の uses セクションの先頭に FastMM4.pas を追加することです。

Q: Windows x64 エディションを使用しています。アプリケーションが 2GB RAM を超えるアドレスを指定できるようにするにはどうすればよいですか?
A: {$SetPEFlags $20} を含む行を .dpr ファイルに追加します。これにより、実行可能ファイルに LARGE_ADDRESS_AWARE フラグが設定され、その結果、Windows x64 はプロセスに通常の 2GB ではなく完全な 4GB のユーザー アドレス空間を与えます。

Q: パッケージを使用するようにコンパイルされたアプリケーションで FastMM を使用しようとすると、「[エラー] ユニット 'FastMM4' から 'IsMultiThread' にアクセスするには、インポートされたデータ参照 ($G) が必要です」というエラーが表示されます。どうすれば動作させることができますか?
A: FastMM4Options.inc の「UseRuntimePackages」オプションを有効にします。

Q: ランタイム パッケージを使用していますが、アプリケーションがシャットダウンすると、大量のアクセス違反に続いて大量のメモリ リーク レポートが表示されます。なぜ?
A: これはおそらくパッケージのアンロード順序の問題です。すべてのライブ ポインターが解放される前に FastMM がアンインストールされ (リーク チェックが実行され)、その後アプリケーションが残りのライブ ポインターを解放しようとすると、A/V が発生します。FastMM が最後にアンロードされていることを確認するか (sharemem と代替の borlndmm.dll を併用するのが 1 つの方法です)、「NeverUninstall」オプションを使用してメモリ リーク レポートを無効にします。

Q: バージョン 4.29 以降、「FullDebugMode」は非常に遅くなります。なぜ?
A: 新しい「RawStackTraces」オプションが原因です。これをオフにすると、パフォーマンスは以前のバージョンと同等になりますが、スタック トレースの完全性は低下します。

Q: IDE 用にプリコンパイルされたデバッグ borlndmm.dll があることに気付きました。なぜそれが必要なのでしょうか?
A: おそらくそうではないでしょう。IDE のバグを探すためのものです。

Q: IDE で使用されている borlndmm.dll を置き換えると、アプリケーションで使用されるメモリ マネージャーにどのような影響がありますか?
A: 違います。アプリケーションのプロジェクトの .dpr ファイルの最初のユニットとして sharemem.pas がある場合、パス上で最初に見つかった borlndmm.dll が使用されます。IDE が使用するものと同じである必要はありません。

Q: メモリ リーク チェックを有効にすると、アプリケーションが遅くなりますか?
A: いいえ。リークチェックはアプリケーションのシャットダウン時にのみ実行されます。

Q: FullDebugMode オプションと RawStackTraces オプションの両方を有効にすると、正しいとは考えられないエントリを含むスタック トレースが取得されることがあります。なぜ?
A: これは、生のスタック トレースを実行することによる残念な副作用です。通常、生のスタック トレースは、代替フレームベースのトレース (RawStackTraces オプションが無効な場合に使用) よりも完全ですが、スタック上のデータ エントリがプログラム コード内の有効なリターン アドレスに偶然対応すると、誤ったアラームが発生することがあります。生のスタック トレース コードは、データとリターン アドレスを区別するために広範なテストを実行しますが、場合によっては間違ったコードを実行し、その結果としてこれらの誤ったエントリが発生します。

Q: Kylix ライブラリ内で FastMM を使用しようとしていますが、セグメンテーション違反が発生します。なぜ?
A: Linux では、ライブラリ内のコードが位置に依存しない (ebx で示されるベース アドレスを持つ) 必要があります。FastMM 内のアセンブラ コードは、ebx レジスタを他の目的に使用するため、位置に依存しません。Kylix ライブラリ内で FastMM を使用したい場合は、FastMM4Options.inc の「ASMVersion」オプションを無効にする必要があります。

Q: FastMM を使用しない BDS2006 アプリケーションと FastMM を使用するライブラリ間 (またはその逆) でメモリ マネージャーを共有するにはどうすればよいですか?
A: デフォルトの Delphi 2006 MM を使用するプロジェクトの uses セクションの最初のユニットとして SimpleShareMem.pas ファイルを追加し、FastMM の共有メカニズム (「ShareMM」および「AttemptToUseSharedMM」オプション) が以下のプロジェクトで有効になっていることを確認します。 FastMM を使用しますが、「EnableSharingWithDefaultMM」オプションも有効にします。

おすすめ

転載: blog.csdn.net/shaken/article/details/3404877