Atualização: este antigo plugin do Xcode foi reorganizado em um pacote Swift para uso em outros aplicativos. Use o produto Xprobe
em aplicativos cliente e o produto XprobeUI
no lado do servidor.
O XprobePlugin oferece uma visão detalhada dos objetos dentro do seu aplicativo, até o nível dos ivars, ou globalmente como um gráfico dos objetos principais e como eles estão conectados. Esta exibição pode ser animada em tempo real, destacando em vermelho os objetos à medida que são enviadas as mensagens e os caminhos pelos quais as mensagens estão fluindo. Isso é feito automaticamente realizando uma "varredura" para encontrar todos os objetos referidos por um conjunto de sementes, os objetos aos quais eles se referem, os objetos aos quais eles se referem e assim por diante para construir a lista de objetos ativos que podem ser exibidos no Xcode :
No simulador, o limpador de memória é carregado a partir de um pacote dentro do plugin usando lldb, não exigindo alterações na fonte do projeto do aplicativo. Para usar o plugin, construa este projeto e reinicie o Xcode. Quando seu aplicativo estiver em execução, use o item de menu "Product/Xprobe/Load" para carregar a visualização inicial da varredura de memória do seu aplicativo. Se você é um desenvolvedor de plugins, use "Product/Xprobe/Xcode" para inspecionar os objetos do próprio aplicativo Xcode.
Você pode então filtrar os objetos listados no aplicativo ou seus métodos usando um padrão. Se não houver objetos que correspondam ao padrão e for um nome de classe, ele será exibido. Os padrões prefixados com '+' ou '-' pesquisarão todas as classes vinculadas ao aplicativo em busca de métodos que correspondam ao padrão. Um ponteiro bruto prefixado com "0x" pode ser inserido para inspecionar um objeto passado como argumento para um rastreamento. Você também pode inserir um "caminho" de objeto começando com "semente". dos caminhos registrados enquanto você navega em seu aplicativo para que você possa encontrar facilmente o caminho de volta aos objetos.
Se você tiver o plugin injectorforxcode instalado, o Xprobe permitirá que você avalie Objective-C ou Swift em relação a uma instância selecionada para a qual você tem a fonte para registrar ou modificar qualquer aspecto do estado do objeto em tempo de execução.
Xprobe.mm agora pode capturar seu aplicativo em um arquivo HTML independente no caso de um erro. Isso executa uma varredura e pode documentar o estado do seu aplicativo no momento em que ocorreu o erro para análise posterior. Um exemplo de arquivo de instantâneo para um projeto de exemplo ReactNative "TickTackToe" pode ser visualizado aqui.
Para tirar um snapshot, inclua Xprobe.mm em seu aplicativo e use a seguinte chamada:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
Se você tiver dificuldades, poderá alterar o padrão de nomes de classes para não capturar com um argumento excluindo:(NSString *)pattern adicional. O valor padrão para isso é:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
Os recursos restantes são mais facilmente eliminados como uma série de marcadores:
Clique no link de um objeto para visualizar seu conteúdo ivar.
Clique no link novamente para fechar a visualização detalhada.
Clique no link da superclasse para ver seus ivars
Clique no nome de um ivar para atualizar seu valor no aplicativo
Clique em um valor ivar para editar e definir seu valor no aplicativo
As propriedades da classe, métodos e quaisquer protocolos podem ser visualizados.
As listas de métodos podem ser pesquisadas (também encontrando métodos de superclasse)
Use o link "trace" para começar a registrar chamadas para métodos nessa instância.
Para ver todos os métodos rastreados para um objeto, clique em rastrear cada classe.
A saída do rastreamento pode ser filtrada usando uma expressão regular
O link de subvisualizações exibirá recursivamente a árvore de subvisualizações em uma visualização.
O link "renderizar" irá capturar uma imagem quando o objeto for uma visualização.
O link irmãos exibirá todos os objetos encontrados que compartilham a classe do objeto.
Atualize a lista de objetos digitando enter no campo de pesquisa para forçar uma nova varredura.
Pressionar o botão Gráfico abrirá a visualização resumida dos objetos mais importantes e de quaisquer objetos "kit" diretamente vinculados a eles, retirados da última varredura.
O objeto é representado como um quadrado se for uma visualização (responde a "subvisualizações".)
A exibição gráfica requer a instalação do "Graphviz/dot" no seu computador.
Clique em um objeto para visualizar seu conteúdo atual conforme discutido acima.
Podem ser aplicadas diferentes filtros de quais objetos incluir.
"Animar Mensagens" rastreia os objetos, fazendo com que eles sejam exibidos em "vermelho" quando enviados por mensagem.
Os gráficos podem ser exportados para o formato Graphviz ou .png para impressão.
Infelizmente, o suporte ao Swift é limitado no momento, pois ivar_getTypeEncoding() retorna NULL para campos ivar, impedindo-os de participar da "varredura".
O Xprobe funciona carregando um pacote no simulador que se conecta ao Xcode quando é carregado. Um aplicativo torna sua lista de nós iniciais conhecida pelo Xprobe implementando a seguinte categoria:
@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
Ou para OSX:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
Depois que um aplicativo for inicializado, chame [Xprobe connectTo:"your.ip.address" retainObjects:YES] para se conectar ao servidor TCP em execução no Xcode. O argumento keepObjects: especifica se os objetos encontrados na varredura devem ser retidos. Isso tornará o Xprobe mais confiável, mas afetará o ciclo de vida dos objetos em seu aplicativo. Depois disso, chame [Xprobe search:@""] para realizar a varredura inicial começando nesses objetos procurando por objetos raiz. Cada vez que "search:" é chamado ou o filtro de classe de objeto é alterado, a varredura é executada novamente. O aplicativo precisará ser construído com Xprobe e Xtrace.{h,mm}.
Nos dias de hoje, com ponteiros "fortes" e "fracos" bem limpos, a varredura parece muito confiável se os objetos estiverem de alguma forma visíveis para as sementes. Algumas classes herdadas não são bem comportadas e usam propriedades de "atribuição" que podem conter ponteiros para objetos desalocados. Para evitar a varredura dos ivars dessas classes, o Xprobe possui um filtro de exclusão que pode ser substituído (com um aviso) em uma categoria:
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
Essas exclusões permitem que o Xprobe funcione de forma limpa dentro do próprio Xcode, o que é útil se você for um desenvolvedor de plugins. Para qualquer sugestão ou feedback, você pode entrar em contato com o autor no xprobe em johnholdsworth.com. Os principais lançamentos serão anunciados no twitter @Injection4Xcode.
Com o Swift 2.3+, o Xprobe não é mais capaz de verificar ivars que não possuem propriedades, ou seja, classes que não herdam de NSObject.
Xprobe.{h,mm} - funcionalidade principal do Xprobe necessária para snapshots IvarAccess.h - rotinas necessárias para acesso a classes ivars por nome Xprobe+Service.mm - serviço interativo opcional conectado ao Xcode
Direitos autorais (c) 2014-5 John Holdsworth. Licenciado para download, modificação e qualquer uso durante o desenvolvimento de aplicativos Objectice-C, a redistribuição só pode ser feita por meio de um repositório público no github, incluindo este aviso de direitos autorais. Para redistribuição binária com seu aplicativo entre em contato!
Esta versão inclui uma versão levemente modificada da excelente biblioteca canviz para renderizar arquivos "ponto" em uma tela HTML que está sujeita a uma licença do MIT. As mudanças são passar do ID do nó para a tag do rótulo do nó (linha 212), reverter a renderização dos nós e das linhas que os ligam (linha 406) e armazenar caminhos de borda para que possam ser coloridos (linha 66 e 303) em "canviz-0.1/canviz.js".
Agora também inclui o editor CodeMirror JavaScript para que o código seja avaliado por injeção sob uma licença do MIT.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.