Обновление: этот бывший плагин Xcode был реорганизован в пакет Swift для использования в других приложениях. Используйте продукт Xprobe
в клиентских приложениях и продукт XprobeUI
на стороне сервера.
XprobePlugin дает вам представление об объектах внутри вашего приложения либо подробно, вплоть до уровня ivars, либо глобально в виде графика основных объектов и того, как они связаны. Этот дисплей можно анимировать в режиме реального времени, выделяя красным объекты по мере их передачи и пути, по которым передаются сообщения. Это делается автоматически путем выполнения «очистки» для поиска всех объектов, на которые ссылается набор начальных чисел, объектов, на которые они ссылаются, объектов, на которые они ссылаются, и т. д. для создания списка живых объектов, который может отображаться в Xcode. :
В симуляторе очиститель памяти загружается из пакета внутри плагина с помощью lldb, не требуя никаких изменений в исходном коде проекта приложения. Чтобы использовать плагин, создайте этот проект и перезапустите Xcode. После запуска приложения используйте пункт меню «Продукт/Xprobe/Загрузка», чтобы загрузить исходное представление очистки памяти вашего приложения. Если вы разработчик плагинов, вы используете «Product/Xprobe/Xcode» для проверки объектов самого приложения Xcode.
Затем вы можете фильтровать объекты, перечисленные в приложении, или их методы, используя шаблон. Если нет объектов, соответствующих шаблону, и это имя класса, оно будет отображено. Шаблоны с префиксом «+» или «-» будут искать во всех классах, связанных с приложением, методы, соответствующие шаблону. Необработанный указатель с префиксом «0x» можно ввести для проверки объекта, переданного в качестве аргумента трассировке. Вы также можете ввести «путь» объекта, начиная с «seed». из путей, зарегистрированных при просмотре приложения, чтобы вы могли легко вернуться к объектам.
Если у вас установлен плагин инъекции forxcode, Xprobe позволит вам оценить Objective-C или Swift на примере выбранного экземпляра, для которого у вас есть источник для регистрации или изменения любого аспекта состояния объекта во время выполнения.
Xprobe.mm теперь может сделать снимок вашего приложения в отдельный html-файл в случае ошибки. При этом выполняется проверка и можно документировать состояние вашего приложения на момент возникновения ошибки для последующего анализа. Пример файла снимка для примера проекта ReactNative «TickTackToe» можно просмотреть здесь.
Чтобы сделать снимок, включите Xprobe.mm в свое приложение и используйте следующий вызов:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
Если у вас возникнут трудности, вы можете изменить шаблон имен классов, чтобы не захватывать его, с помощью дополнительного аргумента exclude:(NSString *)pattern. Значение по умолчанию для этого:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
Остальные функции легче всего представить в виде серии пунктов:
Нажмите на ссылку объекта, чтобы просмотреть его содержимое ivar.
Нажмите ссылку еще раз, чтобы закрыть подробное представление.
Нажмите на ссылку суперкласса, чтобы просмотреть его ивары.
Нажмите на имя ивара, чтобы обновить его значение из приложения.
Нажмите на значение ivar, чтобы отредактировать и установить его значение в приложении.
Можно просмотреть свойства, методы и любые протоколы класса.
В списках методов можно осуществлять поиск (также можно найти методы суперкласса)
Используйте ссылку «trace», чтобы начать регистрацию вызовов методов этого экземпляра.
Чтобы просмотреть все методы, отслеживаемые для объекта, щелкните трассировку для каждого класса.
Вывод трассировки можно фильтровать с помощью регулярного выражения.
Ссылка на подпредставления будет рекурсивно отображать дерево подпредставлений под представлением.
Ссылка «рендеринг» захватывает изображение, когда объект является видом.
Ссылка на одноуровневые элементы отобразит все найденные объекты, имеющие общий класс объекта.
Обновите список объектов, набрав Enter в поле поиска, чтобы выполнить новую развертку.
Нажатие кнопки «График» откроет сводное представление наиболее важных объектов и любых объектов «комплекта», непосредственно связанных с ними, взятых из последнего сканирования.
Объект представлен в виде квадрата, если это вид (отвечает на «подвиды».)
Для отображения графика требуется установка «Graphviz/dot» на вашем компьютере.
Нажмите на объект, чтобы просмотреть его текущее содержимое, как описано выше.
Могут применяться различные фильтры включения объектов.
«Анимированные сообщения» отслеживают объекты, при этом они отображаются красным цветом при отправке сообщения.
Графики можно экспортировать в формат Graphviz или .png для печати.
Увы, поддержка Swift на данный момент ограничена, поскольку ivar_getTypeEncoding() возвращает NULL для полей ivar, не позволяя им участвовать в «очистке».
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" continueObjects:YES], чтобы подключиться к TCP-серверу, работающему внутри Xcode. Аргумент saveObjects: указывает, следует ли сохранять объекты, найденные при очистке. Это повысит надежность Xprobe, но повлияет на жизненный цикл объектов в вашем приложении. После этого вызовите [Xprobe search:@""] для выполнения первоначальной проверки, начиная с этих объектов, в поисках корневых объектов. Каждый раз, когда вызывается «search:» или изменяется фильтр класса объектов, очистка выполняется заново. Приложение необходимо будет создать с помощью Xprobe и Xtrace.{h,mm}.
В наши дни хороших и чистых «сильных» и «слабых» указателей развертка кажется очень надежной, если объекты каким-то образом видны семенам. Некоторые устаревшие классы ведут себя не очень хорошо и используют свойства «назначения», которые могут содержать указатели на освобожденные объекты. Чтобы избежать очистки иваров этих классов, в 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. Об основных релизах будет объявлено в твиттере @Injection4Xcode.
В Swift 2.3+ Xprobe больше не может сканировать ivars, у которых нет свойств, то есть классов, которые не наследуются от NSObject.
Xprobe.{h,mm} — базовая функциональность Xprobe, необходимая для снимков. IvarAccess.h — необходимые процедуры для доступа к ivars класса по имени Xprobe+Service.mm — дополнительная интерактивная служба, подключающаяся к Xcode.
Авторские права (c) 2014-5 Джон Холдсворт. Лицензия разрешена для загрузки, изменения и любого использования во время разработки приложений Objectice-C. Перераспространение может осуществляться только через общедоступный репозиторий GitHub, включая это уведомление об авторских правах. По вопросам бинарного распространения вашего приложения свяжитесь с нами!
Этот выпуск включает в себя слегка измененную версию превосходной библиотеки canviz для рендеринга «точечных» файлов на холсте HTML, на которую распространяется лицензия MIT. Изменения заключаются в том, чтобы передать идентификатор узла в тег метки узла (строка 212), обратить вспять рендеринг узлов и линий, связывающих их (строка 406), а также сохранить контуры ребер, чтобы их можно было раскрасить (строки 66 и 303) в «canviz-0.1/canviz.js».
Теперь он также включает редактор JavaScript CodeMirror для оценки кода с помощью внедрения в соответствии с лицензией MIT.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.