web-dev-qa-db-ja.com

C ++でのメモリ割り当てプロファイリング

私はアプリケーションを書いていて、その総メモリ使用量がすでに高すぎるのに驚いています。アプリケーションの動的メモリ使用量をプロファイルしたい:ヒープ内に各種類のオブジェクトがいくつあり、これらのオブジェクトを作成した関数は何か。また、各オブジェクトはどのくらいのメモリを使用していますか?

これを行う簡単な方法はありますか?私はLinuxとWindowsの両方で作業しているので、どのプラットフォームのツールでも十分です。

注:ここでは、メモリリークは関係ありません。

42
amit

試しましたか Valgrind ? Linux用のプロファイリングツールです。 Memcheckと呼ばれるメモリチェッカー(メモリリークやその他のメモリの問題用)がありますが、Massifという名前のヒーププロファイラーもあります。

17
javier-sanz

単純な統計の場合、すべてのメモリが使用されている場所を見つけるだけで、次のようなテンプレートを追加できます。

template<class T>
class Stats {
  static int instance_count;
public:
  Stats() {
    instance_count++;
  }
  ~Stats() {
    instance_count--;
  }
  static void print() {
    std::cout << instance_count << " instances of " << typeid(T).name() <<
        ", " << sizeof(T) << " bytes each." << std::endl;
  }
};

template<class T>
int Stats<T>::instance_count = 0;

次に、これを基本クラスとして、多数のインスタンスがあると思われるクラスに追加し、現在のメモリ使用量の統計を出力できます。

class A : Stats<A> {
};

void print_stats() {
  Stats<A>::print();
  Stats<B>::print();
  ...
}

これは、オブジェクトが割り当てられた関数を示しておらず、詳細も多すぎませんが、メモリが浪費されている場所を特定するのに十分かもしれません。

10
sth

Windowsの場合は、「crtdbg.h」の関数を確認してください。 crtdbg.hには、メモリ割り当て関数のデバッグバージョンが含まれています。また、メモリリーク、破損の検出、ヒープポインタの有効性のチェックなどの機能も含まれています。

以下の機能が役立つと思います。

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

次のMSDNリンクには、ヒープ状態報告関数とサンプルコードがリストされています http://msdn.Microsoft.com/en-us/library/wc28wkas(VS.80).aspx

8
Nitin Bhide

http://www.softwareverify.com/cpp/memory/index.html からMemory Validatorを試すことができます

これは、メモリ使用量をプロファイリングするために私が出会った最高のツールの1つです。 30日間の評価版が無料でダウンロードできます。

5
Canopus

MTuner -無料のC/C++メモリプロファイラー。以下の説明:

MTunerは、MSVC、GCC、およびClangコンパイラをサポートするマルチプラットフォームのメモリプロファイリング、リーク検出および分析ツールです。機能には、メモリアクティビティのタイムラインベースの履歴、強力なフィルタリング、完全なソースコードを使用した手動計測用のSDK、コマンドラインの使用による継続的な統合のサポート、メモリリークの検出などがあります。 GCCまたはClangクロスコンパイラを使用して、プラットフォームをターゲットとするソフトウェアをプロファイリングします。 Windows、PlayStation 4、PlayStation 3プラットフォームの組み込みサポート、およびWindowsベースのクロスコンパイラーをターゲットとするプラットフォームが付属しています。

3
mtosic

できることがいくつかあります。最も簡単なことは、デバッグmallocライブラリをリンクすることです。ご使用の環境の詳細に応じて、利用可能なそれらの数があります(たとえば、Windowsの_malloc_dbgの場合はgoogle)。

2番目の選択肢は、C++でnewおよびdeleteをオーバーロードできることです。メモリの割り当てと使用状況を追跡する新しい関数を使用して、基本的なnewとdeleteをオーバーロードすることが可能です。

3
Charlie Martin

Win32ネイティブメモリプロファイラーMemProを無料のベータとしてリリースしました。 http://www.puredevsoftware.com/MemPro.htm 。 new/deleteにフックし、さまざまな方法で割り当てを表示できる外部アプリにデータを送信します。これがお役に立てば幸いです。

2
Stewart Lynch

Chapter 1.10 from Game Programming Gems Volume 2Amazon link )詳細aログをダンプするときに適切な統計セットを提供するPeter Daltonによるシンプルで効果的なドロップインデバッグメモリマネージャー。

1
Michael Burr

gperftools を試してください-次のことができます:

  • コードの特定の部分またはプログラム全体を一度にプロファイルします。
  • 正確な関数呼び出しとその継承を示す視覚的な有向グラフを介してデータを表します。
  • 視覚的なグラフでコードの特定の領域に焦点を当てます。
  • ダンプ間の差分を表示します。
  • 使用されている代わりに割り当てられたスペースを表示-これはすべて同じダンプで行われます。

また、プログラムの効率にはほとんど影響しません。

1
abyss.7

第4.6章 Game Programming Gems Volume 8 (Safari Bookプレビューリンク)は、Ricky Lungによる高度なメモリプロファイラーの詳細を示しています。このプロファイラーは、割り当て統計を階層的なコールスタック方式で示し、マルチスレッドをサポートできます。

1
Ricky Lung

前のジョブでは、「Purify」というツールを使用しました。これはRational/IBMによって作成された製品です。これは無料のツールではないと思いますが、かなり良いツールだと思います。ここにいくつかの情報があります:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

1
Andy White

AQtimeサイト で、「割り当てプロファイリング」を適切にサポートしていることがわかりました。

0
amit