Actualización: este antiguo complemento de Xcode se ha reorganizado en un paquete Swift para usarlo en otras aplicaciones. Utilice el producto Xprobe
en aplicaciones cliente y el producto XprobeUI
en el lado del servidor.
XprobePlugin le brinda una vista de los objetos dentro de su aplicación, ya sea en detalle hasta el nivel de ivars o globalmente como un gráfico de los objetos principales y cómo están conectados. Esta pantalla se puede animar en tiempo real, resaltando en rojo los objetos a medida que se envían mensajes y los caminos por los que fluyen los mensajes. Esto se hace automáticamente realizando un "barrido" para encontrar todos los objetos a los que hace referencia un conjunto de semillas, los objetos a los que hacen referencia, los objetos a los que hacen referencia, etc. para crear la lista de objetos activos que se pueden mostrar en Xcode. :
En el simulador, el limpiador de memoria se carga desde un paquete dentro del complemento usando lldb, sin requerir cambios en la fuente del proyecto de la aplicación. Para usar el complemento, cree este proyecto y reinicie Xcode. Una vez que su aplicación se esté ejecutando, use el elemento del menú "Producto/Xprobe/Cargar" para cargar la vista inicial del barrido de memoria de su aplicación. Si es desarrollador de complementos, utilice "Product/Xprobe/Xcode" para inspeccionar los objetos de la propia aplicación Xcode.
Luego puedes filtrar los objetos enumerados en la aplicación o sus métodos usando un patrón. Si no hay objetos que coincidan con el patrón y es un nombre de clase, se mostrará. Los patrones con el prefijo '+' o '-' buscarán en todas las clases vinculadas a la aplicación métodos que coincidan con el patrón. Se puede ingresar un puntero sin formato con el prefijo "0x" para inspeccionar un objeto pasado como argumento de un seguimiento. También puede ingresar una "ruta" de objeto que comience con "semilla". desde las rutas registradas mientras navega por su aplicación para que pueda encontrar fácilmente el camino de regreso a los objetos.
Si tiene instalado el complemento injectionforxcode, Xprobe le permitirá evaluar Objective-C o Swift con una instancia seleccionada para la cual tiene la fuente para registrar o modificar cualquier aspecto del estado del objeto en tiempo de ejecución.
Xprobe.mm ahora puede capturar su aplicación en un archivo html independiente en caso de error. Esto realiza un barrido y puede documentar el estado de su aplicación en el momento en que ocurrió el error para su posterior análisis. Aquí se puede ver un archivo de instantánea de ejemplo para un proyecto de ejemplo de ReactNative "TickTackToe".
Para tomar una instantánea, incluya Xprobe.mm en su aplicación y use la siguiente llamada:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
Si tiene dificultades, puede modificar el patrón de los nombres de las clases para que no se capturen con un argumento de patrón de exclusión adicional: (NSString *). El valor predeterminado para esto es:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
Las características restantes se pueden resumir más fácilmente como una serie de viñetas:
Haga clic en el enlace de un objeto para ver su contenido ivar.
Haga clic en el enlace nuevamente para cerrar la vista detallada.
Haga clic en el enlace de la superclase para ver sus ivars.
Haga clic en el nombre de un ivar para actualizar su valor desde la aplicación
Haga clic en un valor de ivar para editarlo y establecer su valor en la aplicación
Se pueden ver las propiedades, los métodos y los protocolos de la clase.
Se pueden buscar las listas de métodos (también encontrando métodos de superclase)
Utilice el enlace "rastreo" para comenzar a registrar llamadas a métodos en esa instancia.
Para ver todos los métodos rastreados para un objeto, haga clic en rastrear en cada clase.
La salida del seguimiento se puede filtrar mediante una expresión regular.
El enlace de subvistas mostrará de forma recursiva el árbol de subvistas bajo una vista.
El enlace "renderizar" capturará una imagen cuando el objeto sea una vista.
El enlace de hermanos mostrará todos los objetos encontrados que comparten la clase del objeto.
Actualice la lista de objetos escribiendo enter en el campo de búsqueda para forzar un nuevo barrido.
Al presionar el botón Gráfico se abrirá la vista de resumen de los objetos más importantes y cualquier objeto "kit" directamente vinculado a ellos tomado del último barrido.
El objeto se representa como un cuadrado si es una vista (responde a "subvistas").
La visualización de gráficos requiere la instalación de "Graphviz/dot" en su computadora.
Haga clic en un objeto para ver su contenido actual como se explicó anteriormente.
Se pueden aplicar diferentes filtros sobre qué objetos incluir.
"Animar mensajes" coloca un rastro en los objetos y los muestra en "rojo" cuando se envían mensajes.
Los gráficos se pueden exportar a formato Graphviz o .png para imprimir.
Lamentablemente, el soporte de Swift es limitado en este momento ya que ivar_getTypeEncoding() devuelve NULL para los campos de ivar, lo que les impide participar en el "barrido".
Xprobe funciona cargando un paquete en el simulador que se conecta a Xcode cuando se carga. Una aplicación hace que Xprobe conozca su lista de nodos semilla implementando la siguiente categoría:
@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
O para OSX:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
Una vez que se inicializa una aplicación, llame a [Xprobe connectTo:"your.ip.address" retainObjects:YES] para conectarse al servidor TCP que se ejecuta dentro de Xcode. El argumento retenerObjetos: especifica si se retendrán los objetos encontrados en el barrido. Esto hará que Xprobe sea más confiable pero afectará los ciclos de vida de los objetos en su aplicación. Después de esto, llame a [Xprobe search:@""] para realizar el barrido inicial comenzando en estos objetos en busca de objetos raíz. Cada vez que se llama a "búsqueda:" o se cambia el filtro de clase de objeto, el barrido se realiza de nuevo. La aplicación deberá crearse con Xprobe y Xtrace.{h,mm}.
En esta época de buenos y limpios punteros "fuertes" y "débiles", el barrido parece muy confiable si los objetos son de alguna manera visibles para las semillas. Algunas clases heredadas no se comportan bien y utilizan propiedades de "asignación" que pueden contener punteros a objetos desasignados. Para evitar el barrido de los ivars de estas clases, Xprobe tiene un filtro de exclusión que se puede anular (con una advertencia) en una categoría:
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
Estas exclusiones permiten que Xprobe funcione limpiamente dentro de Xcode, lo que resulta útil si eres un desarrollador de complementos. Para cualquier sugerencia o comentario, puede comunicarse con el autor en xprobe en johnholdsworth.com. Los lanzamientos principales se anunciarán en Twitter @Injection4Xcode.
Con Swift 2.3+, Xprobe ya no puede escanear ivars que no tienen propiedades, es decir, clases que no heredan de NSObject.
Xprobe.{h,mm}: funcionalidad principal de Xprobe requerida para instantáneas IvarAccess.h: rutinas requeridas para acceder a las clases ivars por nombre Xprobe+Service.mm: servicio interactivo opcional que se conecta a Xcode
Copyright (c) 2014-5 John Holdsworth. Con licencia para descarga, modificación y cualquier uso durante el desarrollo de aplicaciones Objectice-C, la redistribución solo puede realizarse a través de un repositorio público en github, sin embargo, incluye este aviso de derechos de autor. Para redistribución binaria con su aplicación, ¡póngase en contacto!
Esta versión incluye una versión ligeramente modificada de la excelente biblioteca canviz para representar archivos "punto" en un lienzo HTML que está sujeto a una licencia MIT. Los cambios son pasar a través del ID del nodo a la etiqueta de la etiqueta del nodo (línea 212), invertir la representación de los nodos y las líneas que los unen (línea 406) y almacenar las rutas de los bordes para que puedan colorearse (línea 66 y 303) en "canviz-0.1/canviz.js".
Ahora también incluye el editor JavaScript CodeMirror para que el código se evalúe mediante inyección bajo licencia MIT.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.