2009-06-21 8 views
1

FASTMM4またはデフォルトのメモリマネージャを使用して、すべてのアプリケーションでインスタンス化されたすべてのオブジェクトを一覧表示するにはどうすればよいですか?インスタンス化されたすべてのオブジェクトをリストする方法はありますか?

+0

なぜこの情報が必要ですか?メモリリークをお探しですか?私はそこに別の方法があると思う。 – Alex

+0

@アレキサンダー:いいえ、すべての人! FASTMM4はメモリリークを簡単に示しています。実際には、VCLの特定のクラスがロードされ、インスタンス化されたかどうかを知りたかったのですが、今私はこの質問に合格しました。ありがとう! –

答えて

3

おそらくFastMM4でこれを行うことができますが、それは複雑になります。 ScanForMemoryLeaksプロシージャのコードを調べて、その処理方法を確認してください。

このルーチンは、予想されるメモリリークのリストに対して割り当てられたヒープメモリをすべてチェックし、カウントを含むすべてのものと、オブジェクトが見つかった場合はオブジェクトクラス名を報告します。あなたがしたいことは、割り当てられたヒープメモリをすべてチェックし、見つかったすべてのオブジェクトの数とオブジェクトクラス名を報告することです。だから、これは本当に似た作業です。登録されたポインタリストのチェックを省略して、オブジェクトではないすべてのものを除外してください。

1

これはサポートされておらず、推奨されていませんが、あなたの状況によっては、作成と破壊を記録するためにTObjectを編集できる場合があります。しかし、VCLを修正することは本当に嫌になります。だから、同じことをするためにHelperオブジェクト(2006年から利用可能です)を使うことができますか?作成された各オブジェクトの詳細を別のリストなどに書き込みます。

+0

いいえ、そのためにヘルパーオブジェクトを使用することはできません。 – gabr

+0

Fine!うまくいくはずですが、VCLのデフォルトの変更が最後の選択だと思いますが、それ以外の解決策がない場合は、私はそれを行います。ありがとう。 –

+0

@ gabr: リストがグローバルであれば、彼はすることができます..ヘルパーではできないことがインスタンスデータを作成しています... –

0

Tony Allenの提案を実装する興味深い方法は、実行時にオブジェクト作成メソッドと破壊メソッドをフックすることです。そのトリックを行うかもしれないAsmProfilerプロジェクトの一部である興味深い図書館があります(IMHOの非常に良いビット)。ここでは、すべての重量挙げを行うKOLDetoursユニットへのリンクがあります。

FWIWデルファイの4/5日間に、オブジェクトの作成/破棄をオプションで追跡する計測ベースのクラスを含むフレームワークを実装しました。これはオブジェクトの漏れなどを追跡するためにはうまくいきましたが、膨大な量の情報を生成しました。 FASTMM4は、シャットダウン時にオブジェクトが漏洩したことを知る必要がある場合は、はるかに優れたオプションです。

0

メモリマネージャを変更するには、SetMemoryManagerを呼び出します。 あなたは簡単なスタブになるあなた自身のMMを書くことができます:古いMMへのすべての呼び出しをリダイレクトします(FastMMです。GetMemoryManagerを呼び出して取得できます)。 呼び出しスタックを調べることでオブジェクトの作成/破壊を検出できます。呼び出しはTObjectのNewInstanceメソッドから行う必要があります。

関連する問題