更新:この以前の Xcode プラグインは、他のアプリで使用できるように Swift パッケージに再編成されました。クライアント アプリケーションではXprobe
製品を使用し、サーバー側ではXprobeUI
製品を使用します。
XprobePlugin を使用すると、アプリケーション内のオブジェクトを ivar のレベルまで詳細に表示したり、主要なオブジェクトとその接続方法のグラフとしてグローバルに表示したりできます。この表示はリアルタイムでアニメーション化でき、メッセージが送信されるオブジェクトとメッセージが流れるパスを赤色で強調表示します。これは、「スイープ」を実行して、シードのセットによって参照されるすべてのオブジェクト、それらが参照するオブジェクト、それらが参照するオブジェクトなどを検索して、Xcode で表示できるライブ オブジェクトのリストを構築することによって自動的に行われます。 :
シミュレーターでは、メモリ スイーパーは、lldb を使用してプラグイン内のバンドルからロードされます。アプリのプロジェクト ソースを変更する必要はありません。プラグインを使用するには、このプロジェクトをビルドして Xcode を再起動します。アプリケーションが実行されたら、メニュー項目「Product/Xprobe/Load」を使用して、アプリケーションのメモリ スイープの初期ビューをロードします。プラグイン開発者の場合は、「Product/Xprobe/Xcode」を使用して Xcode アプリケーション自体のオブジェクトを検査します。
その後、パターンを使用して、アプリにリストされたオブジェクトまたはそのメソッドをフィルターできます。パターンに一致するオブジェクトがなく、それがクラス名の場合は表示されます。 「+」または「-」の接頭辞が付いたパターンは、アプリケーションにリンクされているすべてのクラスでパターンに一致するメソッドを検索します。 「0x」というプレフィックスが付いた生のポインタを入力すると、トレースに引数として渡されたオブジェクトを検査できます。 「シード」から始まるオブジェクトの「パス」を入力することもできます。アプリケーションを参照するときに記録されたパスから、オブジェクトに戻る方法を簡単に見つけることができます。
Injectionforxcode プラグインがインストールされている場合、Xprobe を使用すると、実行時にオブジェクトの状態のあらゆる側面を記録または変更するためのソースを持つ、選択したインスタンスに対して Objective-C または Swift を評価できます。
Xprobe.mm は、エラーが発生した場合にアプリをスタンドアロン HTML ファイルにスナップショットできるようになりました。これによりスイープが実行され、エラー発生時のアプリの状態を後で分析できるように文書化できます。 ReactNative サンプル プロジェクト「TickTackToe」のスナップショット ファイルの例は、ここで参照できます。
スナップショットを取得するには、アプリに Xprobe.mm を含めて、次の呼び出しを使用します。
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
問題が発生した場合は、追加の excluding:(NSString *)pattern 引数を使用して、キャプチャしないようにクラス名のパターンを変更できます。このデフォルト値は次のとおりです。
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
残りの機能は、一連の箇条書きとして簡単に展開できます。
オブジェクトのリンクをクリックして、その ivar コンテンツを表示します。
リンクを再度クリックして詳細ビューを閉じます。
スーパークラスのリンクをクリックして、その ivars を表示します
ivar 名をクリックして、アプリからその値を更新します
ivar 値をクリックして編集し、アプリでその値を設定します
クラスのプロパティ、メソッド、およびプロトコルを表示できます。
メソッド リストを検索できます (スーパークラス メソッドも検索できます)。
「トレース」リンクを使用して、そのインスタンスのメソッド呼び出しのログ記録を開始します。
オブジェクトに対してトレースされたすべてのメソッドを表示するには、各クラスに対してトレースをクリックします。
トレース出力は正規表現を使用してフィルタリングできます
サブビュー リンクは、ビューの下にサブビューのツリーを再帰的に表示します。
「レンダリング」リンクは、オブジェクトがビューの場合に画像をキャプチャします。
兄弟リンクには、オブジェクトのクラスを共有する、見つかったすべてのオブジェクトが表示されます。
新しいスイープを強制するには、検索フィールドに Enter を入力してオブジェクト リストを更新します。
「グラフ」ボタンを押すと、最も重要なオブジェクトと、最後のスイープから取得されたオブジェクトに直接リンクされている「キット」オブジェクトの概要ビューが開きます。
オブジェクトがビューである場合、オブジェクトは正方形として表されます (「サブビュー」に対応します)。
グラフ表示には「Graphviz/dot」をパソコンにインストールする必要があります。
上で説明したように、オブジェクトをクリックして現在の内容を表示します。
どのオブジェクトを含めるかについて異なるフィルタリングを適用できます。
「メッセージのアニメーション化」は、オブジェクトにトレースを付けて、メッセージが送信されるとオブジェクトが「赤」で表示されるようにします。
グラフは、印刷用に Graphviz または .png 形式にエクスポートできます。
残念ながら、ivar_getTypeEncoding() が ivar フィールドに対して NULL を返し、「スイープ」に参加できないため、Swift のサポートは現時点では制限されています。
Xprobe は、ロード時に Xcode に接続するバンドルをシミュレーターにロードすることで機能します。アプリケーションは、次のカテゴリを実装することで、シード ノードのリストを Xprobe に認識させます。
@implementation Xprobe (Seeding)
+ ( NSArray *)xprobeSeeds {
UIApplication *app = [UIApplication sharedApplication ];
NSMutableArray *seeds = [ NSMutableArray arrayWithObject: app];
[seeds addObjectsFromArray: [app windows ]];
// support for cocos2d
Class ccDirectorClass = NSClassFromString ( @" CCDirector " );
CCDirector *ccDirector = [ccDirectorClass sharedDirector ];
if ( ccDirector )
[seeds addObject: ccDirector];
return seeds;
}
@end
または OSX の場合:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
アプリが初期化されたら、[Xprobe connectTo:"your.ip.address" restartObjects:YES] を呼び出して、Xcode 内で実行されている TCP サーバーに接続します。 restartObjects: 引数は、スイープで見つかったオブジェクトを保持するかどうかを指定します。これにより Xprobe の信頼性が高まりますが、アプリ内のオブジェクトのライフサイクルに影響します。この後、[Xprobe search:@""] を呼び出して、これらのオブジェクトから開始してルート オブジェクトを探す初期スイープを実行します。 「search:」が呼び出されるたび、またはオブジェクト クラス フィルターが変更されるたびに、スイープが新たに実行されます。アプリケーションは Xprobe と Xtrace.{h,mm} を使用して構築する必要があります。
きれいな「強い」ポインタと「弱い」ポインタが存在するこの時代では、オブジェクトがシードから何らかの形で認識される場合、スイープは非常に信頼できるように見えます。一部のレガシー クラスは動作が悪く、割り当て解除されたオブジェクトへのポインタを含む可能性のある「assign」プロパティを使用します。これらのクラスの ivar のスイープを避けるために、Xprobe にはカテゴリ内でオーバーライドできる (警告付き) 除外フィルターがあります。
static NSString *swiftPrefix = @" _TtC " ;
@implementation Xprobe (ExclusionOverride)
+ ( BOOL )xprobeExclude:( NSString *)className {
static NSRegularExpression *excluded;
if ( !excluded )
excluded = [ NSRegularExpression xsimpleRegexp: @" ^(_|NS|XC|IDE|DVT|Xcode3|IB|VK|WebHistory) " ];
return [excluded xmatches: className] && ![className hasPrefix: swiftPrefix];
}
@end
これらの除外により、Xprobe は Xcode 自体の内部で正常に動作できるようになり、プラグイン開発者にとっては便利です。ご提案やフィードバックがございましたら、xprobe (johnholdsworth.com) の著者にご連絡ください。メジャー リリースは Twitter @Injection4Xcode で発表されます。
Swift 2.3 以降では、Xprobe はプロパティを持たない ivar、つまり NSObject から継承しないクラスをスキャンできなくなりました。
Xprobe.{h,mm} - スナップショットに必要なコア Xprobe 機能 IvarAccess.h - 名前によるクラス ivar へのアクセスに必要なルーチン Xprobe+Service.mm - Xcode に接続するオプションの対話型サービス
著作権 (c) 2014-5 ジョン・ホールズワース。ダウンロード、変更、および Objectice-C アプリケーションの開発中の使用がライセンスされており、再配布はパブリック リポジトリ github 経由でのみ許可されますが、この著作権表示も含まれます。アプリでのバイナリの再配布については、お問い合わせください。
このリリースには、MIT ライセンスの対象となる HTML キャンバスで「ドット」ファイルをレンダリングするための、優れた canviz ライブラリのわずかに変更されたバージョンが含まれています。変更内容は、ノードの ID をノード ラベル タグに渡すこと (212 行目)、ノードとそれらをリンクする線のレンダリングを反転すること (406 行目)、色付けできるようにエッジ パスを保存すること (66 行目と 66 行目) です。 303) 「canviz-0.1/canviz.js」内。
MIT ライセンスに基づいてインジェクションを使用してコードを評価するための CodeMirror JavaScript エディターも含まれるようになりました。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。