Как отлаживать расширения iOS 8 с помощью NSLog?

90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

в viewDidLoadиз IOS , 8 расширения . не NSLogвыводит ничего в Xcode. NSLogработает как обычно в приложении-контейнере.

Как я могу получить вывод отладочных сообщений от расширения?

охо
источник
У меня тоже есть эта проблема. Может быть, NSLog просто сломан. В настоящий момент я использую точки останова для отладки значений. Но и они действительно глючные.
gallileo
У меня аналогичная проблема, когда отладчик никогда не фиксируется и всегда говорит «ожидает подключения» в Xcode. К сожалению, я не вижу ничего полезного в поиске в Google и разместил здесь в Stack вопрос, на который пока нет ответов.
Alex Bollbach

Ответы:

95
  1. Отладка работает с расширениями приложений.
  2. Он работает и на симуляторе.
  3. Если ваше приложение ext вылетает в симуляторе, вы можете обнаружить, что перезапустить приложение ext не так просто. Быстрое решение - перезапуск симулятора.
  4. Шаги по отладке расширения приложения:

    1. Запустите приложение-контейнер. На этом этапе Xcode загружает приложение-контейнер и расширение приложения на устройство или симулятор.

    2. Остановите приложение-контейнер. Этот шаг важен при отладке в симуляторе. Если вы этого не сделаете, Xcode сообщит вам, что симулятор используется.

    3. В Xcode нажмите меню «Отладка» -> «Прикрепить к процессу» -> «По идентификатору процесса (PID) или имени ...», введите идентификатор ext приложения, например com.abc.ContainerApp.MyExtension, чтобы начать отладку. Не забудьте установить точки останова. (Обновление от 25 августа 2014 г.: вы можете напрямую ввести MyExtension (имя вашего расширения).)

    4. На устройстве или симуляторе откройте расширение приложения.


Обновления от 23 августа 2014 г .:

Я обнаружил, что описанные выше шаги отладки не работают на Xcode 6 beta 6 с iOS 8 SDK beta 5 на симуляторе.

Решение:

  1. Запустите ваше расширение в симуляторе.
  2. Меню Xcode Отладка -> Присоединить к процессу -> Выберите «MyExtension (имя вашего расширения)» в разделе «Система» в меню.

Точки останова работают. Но я не знаю, почему журналы не отображаются в окне вывода.

Винс Юань
источник
8
Пока что самый простой способ отладки (и см. NSLog), который я нашел, - это выполнить следующие шаги: /// 1 /// Выберите схему приложения-контейнера и запустите ее. /// 2 /// После запуска - переключитесь обратно на XCode и (даже не нажимая кнопку Stop) выберите схему расширения, затем нажмите кнопку Run. /// 3 /// Когда будет предложено выбрать приложение для запуска, выберите «Сегодня». /// 4 /// Теперь точки останова и NSLog должны работать без проблем.
прерывание
1
Это не работает даже сегодня, особенно после сбоя. Это очень раздражает, я не понимаю, почему это так сложно исправить.
Cristi Băluță
3
Я попытался использовать обновленные инструкции выше, и у меня это сработало. Однако на шаге 2 вместо использования имени расширения я использовал «По идентификатору процесса (PID) или имени ...» и ввел pid процесса. Это волшебным образом позволило мне использовать свои точки останова.
tony.tc.leung 08
Отладка> Присоединить к процессу по PID или имени: в текстовом поле введите имя процесса в навигаторе отладки, например com.company.AppName.AppName-ExtensionName
TigerCoding
Этот ответ не имеет отношения к вопросу. OP спрашивает, почему сообщения NSLog не записываются на консоль в расширении (законное беспокойство, поскольку я пришел на эту страницу с тем же вопросом). Он ничего не упоминает о проблемах с подключением к отладчику.
Джои Карсон
49

У меня тоже такая проблема. У меня это сработает, если вы войдете в свой симулятор в меню Debug -> Open System Log ...

Отсюда вы можете увидеть все журналы симулятора iPhone (включая журналы вашего расширения).

введите описание изображения здесь

БалестраПатрик
источник
он откроет "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log", чтобы вы могли легко найти там журналы всех других устройств симулятора, просто замените <DEVICE_IDENTIFIER> на идентификатор устройства симулятора
Hofi,
32

NSLogработает отлично .

Вы просто не видите, что регистрируется в области отладки Xcode, потому что отладчик Xcode не подключен к вашему расширению. Расширения почти полностью независимы от своего приложения. Например, у них есть отдельные идентификаторы пакетов, и они также являются отдельными процессами в ОС.

У меня были разные успехи в подключении Xcode к расширениям. Предположительно кажется, что он подключается автоматически, и в навигаторе отладки отображается как «Ожидание подключения», но никогда не подключается.

Иногда мне удается запустить цель расширения в Xcode:

введите описание изображения здесь

А затем у меня есть возможность выбрать, в каком приложении запускать мое расширение. В этом случае я бы выбрал его рекомендацию «сегодня», которая является центром уведомлений.

введите описание изображения здесь

А потом иногда присоединял отладчик к моему расширению. Обратите внимание, что этот метод работает только на физических устройствах.

Если он не прикрепляется, вы можете использовать метод ручного прикрепления в ответе @VinceYaun,

У меня также был переменный успех, используя другие методы привязанности. Большинство из них были безуспешными, и кажется, что это просто ошибки, которые будут исправлены позже.

Чтобы просмотреть сообщения журнала, перейдите в Window-> Devicesна верхней панели и выберите свое устройство. Вы можете открыть журнал устройства в нижней части этого окна. Если вы тестируете на симуляторе, вы можете использовать ответ @ BalestraPatrick .

Некоторые ошибки были исправлены в бета-версии 2, и я предполагаю, что в конечном итоге отладчик подключится автоматически при запуске расширения.

Обновление: в примечаниях к выпуску iOS 8 Beta 4 :

Расширения

Исправлено в бета 4

  • Иногда расширения не запускаются при отладке из Xcode.
  • Когда расширение с пользовательским интерфейсом убито, оно перезапускается и не закрывается.
  • Иногда может зависать ваше расширение общего доступа или действия.
  • Повторное развертывание расширения может отключить его в Центре уведомлений.
Санта Клаус
источник
вы пробовали такой же подход для Storage Extensions?
SRP-Achiever
У меня это не сработало в Xcode 6 beta 2, но ответ Винса Юаня сработал . К сожалению, в Xcode 6 beta 3 отладка расширений у меня вообще не работает. Я не нашел решения этой проблемы, наверное, нам нужно дождаться следующего релиза.
Darrarski
@Darrarski Мой ответ остался от бета-версии 1. К вашему сведению, бета-версия 3 вышла, так что вы уже должны принять это.
Санта-Клаус
@SantaClaus довольно ясно. Мой комментарий состоял в том, чтобы сообщить, что ни одно из данных решений не работает для меня в Xcode 6 beta 3. Похоже, что в этом выпуске отладка расширений еще больше нарушена. Будем надеяться, что следующая бета исправит проблему.
Darrarski
3
Ни одна из этих ошибок не казалась мне исправленной в бета-версии 4 (теперь бета-версия 5).
Мэтт
18

У меня тоже такая проблема. Xcode никогда не подключает мой отладчик к расширению и не отображает сообщения NSLog. Если вы вручную подключите отладчик Xcode к процессу расширения, по крайней мере точки останова будут работать как шарм:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Масалис
источник
5
Мне с этим не повезло.
Санта-Клаус
2
Проголосовать, но не всегда работает, надеюсь, Apple сможет автоматически подключать отладчик к расширениям в будущих выпусках.
Jing
14
  1. Создайте схему для вашего расширения
  2. Схема запуска
  3. В диалоговом окне выберите приложение-контейнер
  4. наслаждаться

У меня работает :)

Мацек Чарник
источник
Это именно то, что мне нужно
pob21
1
NSLogбудет работать, только если вы используете приложение-контейнер. Это не сработает, если вы запустите расширение приложения вместо контейнера.
JaredH
Это сработало и для меня. Спасибо, Мацек Чарник! Вышеупомянутые решения не сработали для меня. Я использую Xcode 8.1.
plam4u
5

Xcode 8 может отлаживать расширения:

  1. Выберите схему расширения в комбинированном списке рядом с кнопкой остановки и запустите ее.
  2. В появившемся диалоговом окне выберите родительское приложение.

Результат: точки останова и журнал работают в обычном режиме.

Яно
источник
2
Не работает в моем случае с расширением Today. получение ошибки CLANG: ld: библиотека не найдена для -lRPush clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
BadmintonCat
Это не связанная с этим ошибка. Вы пытаетесь установить ссылку на отсутствующую библиотеку. Добавьте Liferay-Push к своей цели.
Яно
4

Что наконец позволило мне увидеть журнал в области отладки, основываясь на предложении Майкла и документации Apple , так это:

Создайте и запустите расширение приложения в симуляторе и, когда будет предложено указать хост-приложение, выберите конкретное приложение, из которого вы собираетесь вызывать расширение . В моем случае я запускал расширение Action из Safari, открывая общий лист в PDF.

Что раньше не работало, так это следование предложениям других людей об использовании Today в качестве хоста, но затем выход из этого приложения и переход в Safari для вызова моего добавочного номера. Мне больше даже не нужно сначала запускать мое содержащее приложение перед запуском расширения.

Из документации Apple:

На этапе выполнения вашей схемы расширения вы указываете ведущее приложение в качестве исполняемого файла. После доступа к расширению через пользовательский интерфейс указанного хоста отладчик Xcode присоединяется к расширению.

Андрей
источник
1

На самом деле мне удалось довольно просто запустить журналы в Xcode 6.3. Во-первых, соберите и запустите содержащее приложение. После того, как содержащее приложение будет запущено на устройстве, создайте и запустите расширение приложения, изменив схему на расширение приложения.

У Apple есть документация, непосредственно связанная с отладкой, профилированием и тестированием расширения вашего приложения.

Майкл
источник
1

У меня работает трюк (хотя он довольно уродливый) - разместить манекен UILabelгде-нибудь в нижнем углу моего расширения. Я обычно это называю logLabel. Затем можно обновить текст этой метки любым оператором журнала, который вы хотите регистрировать. Такой подход не очень хорош, если вам нужно регистрировать операторы из экземпляров разных классов. И, очевидно, это загромождает ваш пользовательский интерфейс.

Однако, если у вас есть довольно простой виджет, и вы не возражаете против небольшого загромождения пользовательского интерфейса, это поможет. Я пробовал все другие решения, описанные в этом обсуждении, и, к сожалению, ни одно из них не помогло мне.

Андрей Гордийчук
источник
1

Единственный способ отладки для меня - это выбрать «Отладка»> «Присоединить к процессу по PID или имени». Затем введите PID, а не имя расширения. Вы можете найти PID, запустив расширение на устройстве, перейдите в Window-> Devices. Найдите свое устройство и посмотрите на консоль. Когда вы видите имя своего добавочного номера, за ним следует пятизначный номер.Это PID

Я также поместил кучу NSLog в расширение, чтобы также найти PID. Это на xCode 7

Тони
источник
1

Возникла та же проблема с расширением для NSLog и точками останова. Я боролся с этим много дней.

Device logможно найти как следующее изображение. Это вXCode -> Window -> Devices and Simulators .

После ввода в Open Consoleправом верхнем углу диалогового окна появится поле поиска. Я могу применить там правило фильтра. Например, имя процесса содержит Notificationключевое слово или имя процесса должно совпадать с именем цели расширения, например: равно MyNotificationServiceExtensionимени процесса.

Журнал устройства

AechoLiu
источник
0

Ясно, что в Xcode6-B5 что-то не работает.

Если я попытаюсь запустить расширение Photo на симуляторе, я не смогу увидеть Photos.app в качестве опции для процесса присоединения расширения.

параметры отладки в симуляторе

То же самое, работающее на реальном устройстве, дает мне правильное поведение.

параметры отладки на реальном устройстве

В первом случае точка останова не учитывается. В последнем случае точки останова работают как шарм.

вальволин
источник
0

Вы должны знать, что приложение-контейнер и расширение - это два разных процесса в iOS, в то время как LLVM отлаживает только поток за раз, поэтому при отладке консоль никогда не регистрирует расширение и никогда не останавливается в точке останова.

Вы можете решить большинство проблем методом @Vince Yuan.

Однако моя проблема в том, что отладчик Xcode вряд ли зацепит мое расширение клавиатуры как на iOS Simulator, так и на устройствах, например, 1 раз из 7-8 запусков, это полностью вопрос вероятности. Метод @Vince Yuan тоже иногда работает.

Мой небольшой опыт заключается в том, что когда вы запускаете схему отладки, если сеанс отладки на левой панели показывает, что `` Нет сеанса отладки '', нет необходимости открывать ваше расширение и тестировать его, отладчик не подключился, просто запустите снова на удачу.

но когда вы видите, что com.xxx.xxx.xxx ожидает подключения, расширение определенно можно отладить.

Это небольшая уловка, для которой невозможно отладить расширение iOS, особенно расширение клавиатуры.

Генри
источник
0

Начиная с Xcode 6 Beta 5, я мог использовать реальное устройство под управлением iOS8 для отладки моего расширения. Попробуйте запустить его на устройстве и выберите Safari для запуска.

Rich86man
источник
0

Чтобы преодолеть все состояния, вызванные когда-либо изменением среды IDE, я использую консоль iOS на сайте lemonjar.com - она ​​отображает окно консоли для любого подключенного устройства iOS, отображающего сообщения системного журнала, независимо от идентификатора процесса. Здесь вы можете одновременно видеть сообщения журнала отладки приложения и расширения.

igraczech
источник
0

Я мог отлаживать свое расширение описанным ниже способом:

  1. Xcode : Debug->Attach to process by PID or Name . Название вашей схемы расширения.
  2. Затем выберите свой main app targetи запустите.

Надеюсь, это сработает и для вас, ребята.

Абдуллахселек
источник