修正日: 07/10/24
MallocDebug
Performance Tools入門 その1
1. はじめに
MallocDebugは対象アプリケーションのメモリの使用状態(メモリの全体量/増減/リーク/バッファオーバーランなど)を検査するアプリケーションです。検査対象となるアプリケーションに/usr/lib/libMallocDebug.A.dylibを動的にリンクし、特殊なmalloc関数を使用することでメモリの状態を取得し、表示することができます。(本稿ではver1.6を元に説明します)なおCocoaアプリケーションだけでなくCarbonアプリケーションの検査をすることもできます。
本稿ではサンプルとしてmLeakerというテストアプリケーションを使います(こちらからダウンロードしてください)。各ボタンを押すとMallocDebugの動作を検証できるようなメモリの割当/解放処理を行います。詳しくは記事の中で説明します。
2. 検査対象アプリの選択・起動
Fileメニューの「New Window」でウィンドウを開き、「Browse...」ボタンで検査したいアプリを選択します。【図1】 mLeaker起動直後のブラウザ
![](images/malloc/1.png)
・Executable:
検査したいアプリケーションのパスを指定します。「 Browse...」ボタンでファイルを指定することができます。
・Arguments:
対象アプリを起動するときに渡す引数を指定します。省略できます。
アプリを選択したら「Launch」ボタンでそのアプリが起動します。MallocDebugを通して立ち上げることではじめて「libMallocDebug.A.dylib」がリンクされ、メモリ内容の調査をすることが可能になります。現在起動中のアプリを調査したい場合は一度終了させ、MallocDebugから起動し直す必要があります。
3. ブラウザの見方
【図2】 mLeaker起動直後のブラウザ![](images/malloc/2.png)
サンプルのmLeakerというソフトをMallocDebugを使って起動してみます。Launchボタンで起動させるとウィンドウ真ん中のブラウザにすぐに反応が現れます(図2)。
このブラウザでは関数の呼び出しツリーを表示し、各関数の中でどれだけのメモリが確保されているかを示しています。
図2はmLeaker起動直後の状態ですが、NSApplicationMain以下で604.5KBのメモリが確保されていることがわかります(既に解放されたものは含みません。現在占有しているメモリの量です)。その内訳はというと、NSBundleクラスのloadNibNamed:owner:で344.8KB、NSBundleのmainbandleで106.4KB、NSApplicationのsharedApplicationで80.4KB...ということになります。さらにブラウザを動かすことでloadNibNamed:owner:内の詳細を調べることができます。例えばアプリケーションが予想外に大量のメモリを消費している場合、どの関数で多くのメモリブロックを確保しているのかを、このブラウザで調べることができます。
この表示は自動更新はされませんので、「Update」ボタンで適宜更新します。