Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Xojo
あけましておめでとうございます。Xojo のデスクトップアプリ開発を支援するランタイムツール Xojo Instruments を GitHub で公開しました。ライセンスは MIT です。Xcode に付属する Instruments のようにメモリリークを検出したり循環参照を検出することができるツールです。XojoInstruments フォルダを自分のプロジェクトにコピーして、
XojoInstruments.Start()
を書き足すだけで動作します。スクリーンショットを見ていただければ大凡イメージがつくと思いますが、ランタイム状態の Snapshot を任意のタイミングでキャプチャすることができます。ランタイム状態には全オブジェクトの一覧が含まれるため、Snapshot 間の比較を行うことでメモリリークの検出が簡単に行えます。また、Build Reference Graph を有効にしてキャプチャを行うと参照グラフが同時に採取され、参照関係の可視化やバックリファレンス(対象オブジェクトを参照しているオブジェクト)の追跡も行えるようになります。

このツールのポイントは二つです。
  • リークが発生したオブジェクトのクラス名や数が分かるだけでなく(これは MemChecker など既存のツールでもできていた)、実際にリークが発生したオブジェクトがどこから参照されているのかを追跡することができる。また、そのオブジェクトの詳細情報を IDE 上で確認することができる。
  • ランタイムに組み込んで使用するツールでありながら Xojo Instruments 自体の生成するオブジェクトが Snapshot から完全に除外されている。ディクショナリや配列など Snapshot の採取に必要なデータ構造は XojoInstruments.Framework 配下に XIObject interface を実装するクラスとして独自に定義し、XIObject interface を実装しているクラスを Snapshot の採取対象外にすることで実現されている。
反面、Snapshot の取得中は stop the world が生じるというデメリットもあります。内部的には、ランタイム上に存在する全オブジェクトをイテレートして ID を採番した上で各オブジェクトへの弱参照を取得するのでそれなりに時間がかかります(2 回目以降のキャプチャは差分のみ)。高速化のアイディアはいくつかあるのでおいおい取り組みたいところです。

ということで、どなたかのお役に立てば幸いです。

Comments

Leave Yours...
Name:
E-mail / URL (optional):
Comment:
Are You Robot?: