2014年5月26日月曜日

実行時解析したクラス情報を検索・閲覧できるデバッグ用ライブラリ Objective Beagle

実行中のプロセスのヒープを独自に解析して(あとランタイム関数を使って)クラスとインスタンス情報を取り出す(らしい。


指定クラスのインスタンスを一覧
(lldb) po beagle(@"UISwitch")
<__NSCFArray 0x8f2e6c0>(
<UISwitch: 0x8f73aa0; frame = (93 226; 51 31); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8f73bd0>>,
<UISwitch: 0x8e6fa50; frame = (171 226; 51 31); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8c6a760>>
)

同じく指定クラスのインスタンスだがサブクラスを含めない
(lldb) po beagle_exact(@"UIView")
<__NSCFArray 0x8cd27a0>(
<UIView: 0x8f722b0; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x8f71ca0>>,
<UIView: 0x8f74180; frame = (-35.5 0; 51 31); layer = <CALayer: 0x8f741e0>>,
<UIView: 0x8f74210; frame = (0 0; 51 31); layer = <CALayer: 0x8f74270>>,
...

指定クラスで最初に見つかったインスタンスを返す。見つからない場合はnilが変えるので有無をチェックできる。
(lldb) po beagle_first(@"UIApplication")


(lldb) po beagle_first(@"MKMapView")
nil

クラス名のプリフィックスを条件にしたクラス検索
(lldb) po beagle_classes(@"OB")
<__NSCFArray 0xe095e00>(
OBViewController,
OBAppDelegate
)

指定クラスのサブクラス一覧
(lldb) po beagle_subclasses(@"UIButton")
<__NSCFArray 0x8c50890>(
_UIActivityGroupListViewDimControl,
UIActivityGroupCancelButton,
UIKeyboardDictationStarkDoneButton,
_UIStepperButton,
UIRoundedRectButton,
UITexturedButton,
UITableViewCellDeleteConfirmationButton,
...

NSObjectのカテゴリを用意しているので任意のクラスに対してメソッドを投げて調べることもできる。
@interface NSObject (RHBeagleAdditions)

+ (NSArray *)beagle_instances;
+ (NSArray *)beagle_exactInstances;
+ (id)beagle_firstInstance;
+ (NSArray *)beagle_subclasses;
@end

利用は RHObjectiveBeagle.h/mを加えるだけ(CocoaPods対応あり)。

また.dylib が用意されていて、これをlldb上で所定の手順でリンクするとプロダクションビルドでも利用することができる。これはいいかも。

0 件のコメント:

コメントを投稿