Update: Dieses frühere Xcode-Plugin wurde in ein Swift-Paket zur Verwendung in anderen Apps umstrukturiert. Verwenden Sie das Produkt Xprobe
in Clientanwendungen und das Produkt XprobeUI
auf der Serverseite.
Das XprobePlugin bietet Ihnen eine Ansicht der Objekte in Ihrer Anwendung, entweder im Detail bis auf die Ebene von Ivars oder global als Diagramm der Hauptobjekte und ihrer Verbindung. Diese Anzeige kann in Echtzeit animiert werden und Objekte während der Nachrichtenübermittlung sowie die Pfade, über die Nachrichten fließen, rot hervorheben. Dies geschieht automatisch, indem ein „Sweep“ durchgeführt wird, um alle Objekte zu finden, auf die ein Satz von Seeds verweist, die Objekte, auf die sie verweisen, die Objekte, auf die sie verweisen usw., um die Liste der Live-Objekte zu erstellen, die in Xcode angezeigt werden können :
Im Simulator wird der Memory Sweeper mithilfe von lldb aus einem Bundle innerhalb des Plugins geladen, was keine Änderungen an der Projektquelle der App erfordert. Um das Plugin zu verwenden, erstellen Sie dieses Projekt und starten Sie Xcode neu. Sobald Ihre Anwendung ausgeführt wird, verwenden Sie den Menüpunkt „Product/Xprobe/Load“, um die erste Ansicht des Speicherdurchlaufs Ihrer App zu laden. Wenn Sie ein Plugin-Entwickler sind, verwenden Sie „Product/Xprobe/Xcode“, um die Objekte der Xcode-Anwendung selbst zu überprüfen.
Anschließend können Sie die in der App aufgelisteten Objekte oder deren Methoden anhand eines Musters filtern. Wenn keine mit dem Muster übereinstimmenden Objekte vorhanden sind und es sich um einen Klassennamen handelt, wird dieser angezeigt. Muster mit dem Präfix „+“ oder „-“ durchsuchen alle mit der Anwendung verknüpften Klassen nach Methoden, die dem Muster entsprechen. Ein Rohzeiger mit dem Präfix „0x“ kann eingegeben werden, um ein Objekt zu untersuchen, das als Argument an eine Ablaufverfolgung übergeben wird. Sie können auch einen Objekt-„Pfad“ eingeben, der mit „Seed“ beginnt. aus den Pfaden, die beim Durchsuchen Ihrer Anwendung protokolliert werden, sodass Sie leicht zu den Objekten zurückfinden können.
Wenn Sie das Plugin „injectionforxcode“ installiert haben, können Sie mit Xprobe Objective-C oder Swift anhand einer ausgewählten Instanz bewerten, für die Sie die Quelle haben, um jeden Aspekt des Objektstatus zur Laufzeit zu protokollieren oder zu ändern.
Xprobe.mm kann jetzt im Fehlerfall einen Snapshot Ihrer App in eine eigenständige HTML-Datei erstellen. Dadurch wird eine Überprüfung durchgeführt und der Status Ihrer App zum Zeitpunkt des Auftretens des Fehlers für eine spätere Analyse dokumentiert. Eine Beispiel-Snapshot-Datei für ein ReactNative-Beispielprojekt „TickTackToe“ kann hier angezeigt werden.
Um einen Schnappschuss zu erstellen, fügen Sie Xprobe.mm in Ihre App ein und verwenden Sie den folgenden Aufruf:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
Wenn Sie auf Schwierigkeiten stoßen, können Sie das Muster der nicht zu erfassenden Klassennamen mit einem zusätzlichen Argument „exclusive:(NSString *)pattern“ ändern. Der Standardwert hierfür ist:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
Die übrigen Funktionen lassen sich am einfachsten als eine Reihe von Aufzählungspunkten zusammenfassen:
Klicken Sie auf den Link eines Objekts, um dessen Ivar-Inhalt anzuzeigen.
Klicken Sie erneut auf den Link, um die Detailansicht zu schließen.
Klicken Sie auf den Superklassen-Link, um die Ivars anzuzeigen
Klicken Sie auf einen Ivar-Namen, um dessen Wert in der App zu aktualisieren
Klicken Sie auf einen Ivar-Wert, um seinen Wert in der App zu bearbeiten und festzulegen
Die Eigenschaften, Methoden und etwaigen Protokolle der Klasse können angezeigt werden.
Die Methodenlisten können durchsucht werden (es werden auch Oberklassenmethoden gefunden)
Verwenden Sie den Link „Trace“, um mit der Protokollierung von Methodenaufrufen in dieser Instanz zu beginnen.
Um alle für ein Objekt verfolgten Methoden anzuzeigen, klicken Sie auf „Verfolgen für jede Klasse“.
Die Trace-Ausgabe kann mithilfe eines regulären Ausdrucks gefiltert werden
Der Link „Unteransichten“ zeigt rekursiv den Baum der Unteransichten unter einer Ansicht an.
Der Link „Rendern“ erfasst ein Bild, wenn es sich bei dem Objekt um eine Ansicht handelt.
Der Geschwister-Link zeigt alle gefundenen Objekte an, die die Klasse des Objekts gemeinsam haben.
Aktualisieren Sie die Objektliste, indem Sie die Eingabetaste in das Suchfeld eingeben, um einen neuen Sweep zu erzwingen.
Durch Drücken der Schaltfläche „Diagramm“ wird die Übersichtsansicht der wichtigsten Objekte und aller direkt damit verknüpften „Kit“-Objekte aus dem letzten Sweep geöffnet.
Das Objekt wird als Quadrat dargestellt, wenn es sich um eine Ansicht handelt (reagiert auf „Unteransichten“).
Für die Diagrammanzeige ist eine Installation von „Graphviz/dot“ auf Ihrem Computer erforderlich.
Klicken Sie auf ein Objekt, um dessen aktuellen Inhalt anzuzeigen, wie oben beschrieben.
Es kann eine unterschiedliche Filterung der einzubeziehenden Objekte angewendet werden.
„Animate Messages“ erstellt eine Spur für Objekte, sodass diese bei Nachrichten „rot“ angezeigt werden.
Diagramme können zum Drucken in das Graphviz- oder PNG-Format exportiert werden.
Leider ist die Swift-Unterstützung im Moment begrenzt, da ivar_getTypeEncoding() für Ivar-Felder NULL zurückgibt und verhindert, dass sie am „Sweep“ teilnehmen.
Xprobe lädt ein Bundle in den Simulator, das beim Laden eine Verbindung zu Xcode herstellt. Eine Anwendung macht Xprobe ihre Liste der Seed-Knoten bekannt, indem sie die folgende Kategorie implementiert:
@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
Oder für OSX:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
Sobald eine App initialisiert ist, rufen Sie [Xprobe connectTo:"your.ip.address" retainObjects:YES] auf, um eine Verbindung zum TCP-Server herzustellen, der in Xcode ausgeführt wird. Das Argument „retainObjects:“ gibt an, ob im Sweep gefundene Objekte beibehalten werden sollen. Dadurch wird Xprobe zuverlässiger, es wirkt sich jedoch auf die Objektlebenszyklen in Ihrer App aus. Rufen Sie danach [Xprobe search:@""] auf, um den ersten Scan durchzuführen, der bei diesen Objekten beginnt und nach Stammobjekten sucht. Bei jedem Aufruf von „search:“ oder bei jeder Änderung des Objektklassenfilters wird der Sweep erneut durchgeführt. Die Anwendung muss mit Xprobe und Xtrace.{h,mm} erstellt werden.
In der heutigen Zeit der schönen, sauberen „starken“ und „schwachen“ Zeiger scheint der Sweep sehr zuverlässig zu sein, wenn Objekte irgendwie für die Samen sichtbar sind. Einige ältere Klassen verhalten sich nicht gut und verwenden „Assign“-Eigenschaften, die Zeiger auf freigegebene Objekte enthalten können. Um zu vermeiden, dass die Ivars dieser Klassen durchsucht werden, verfügt Xprobe über einen Ausschlussfilter, der in einer Kategorie (mit einer Warnung) überschrieben werden kann:
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
Diese Ausschlüsse ermöglichen es Xprobe, sauber in Xcode selbst zu arbeiten, was praktisch ist, wenn Sie ein Plugin-Entwickler sind. Für Vorschläge oder Feedback können Sie den Autor auf xprobe unter johnholdsworth.com kontaktieren. Wichtige Veröffentlichungen werden auf Twitter @Injection4Xcode bekannt gegeben.
Mit Swift 2.3+ ist Xprobe nicht mehr in der Lage, Ivars zu scannen, die keine Eigenschaften haben, also Klassen, die nicht von NSObject erben.
Xprobe.{h,mm} – für Snapshots erforderliche Kernfunktionen von Xprobe. IvarAccess.h – erforderliche Routinen für den Zugriff auf Klassen-IVars nach Namen. Xprobe+Service.mm – optionaler interaktiver Dienst, der eine Verbindung zu Xcode herstellt
Copyright (c) 2014-5 John Holdsworth. Lizenziert für den Download, die Änderung und jegliche Nutzung während der Entwicklung von Objectice-C-Anwendungen. Die Weiterverbreitung darf nur über ein öffentliches Repo-Github erfolgen, jedoch mit diesem Urheberrechtshinweis. Für die binäre Umverteilung mit Ihrer App kontaktieren Sie uns!
Diese Version enthält eine leicht modifizierte Version der hervorragenden Canviz-Bibliothek zum Rendern von „Dot“-Dateien in einem HTML-Canvas, die einer MIT-Lizenz unterliegt. Die Änderungen bestehen darin, die ID des Knotens an das Knotenbeschriftungs-Tag weiterzuleiten (Zeile 212), die Darstellung von Knoten und den sie verbindenden Linien umzukehren (Zeile 406) und Kantenpfade zu speichern, damit sie eingefärbt werden können (Zeile 66 und 303) in „canviz-0.1/canviz.js“.
Es enthält jetzt auch den CodeMirror-JavaScript-Editor für die Auswertung des Codes per Injektion unter einer MIT-Lizenz.
DIE SOFTWARE WIRD „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG. IN KEINEM FALL SIND DIE AUTOREN ODER COPYRIGHT-INHABER HAFTBAR FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG, WEDER AUS EINER VERTRAGLICHEN HANDLUNG, AUS HANDLUNG ODER ANDERWEITIG, DIE SICH AUS, AUS ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDELN IN DER SOFTWARE ERGEBEN SOFTWARE.