2015-03-17 3 views
16

Я только начинаю работу с Apple Watch. Я нашел инструкции от «Five Minute Watchkit», о том, как приложение iOS и приложение набора часов работают как в симуляторе, так и в обоих процессах, подключенных к отладчику LLDB.Xcode прикрепляется к процессу не отображается NSLog

Что я делаю, это запуск и выход из приложения iOS для установки текущей версии в симу. Затем я переключаюсь на схему watchKit и запускаю ее, которая отображает пользовательский интерфейс приложения часов на симуляторе часов.

Затем я запускаю соответствующее приложение iOS в симуляторе, а затем пользователь «присоединяется к процессу» в меню Xcode, чтобы прикрепить отладчик к запущенному iOS-приложению.

Это работает. Я могу установить точки останова в наборе часов TouchController или в моем приложении iOS, и отладчик там разрывается, когда это необходимо.

Однако я не вижу операторов NSLog() в консоли отладки из моего приложения iOS. (Я вижу инструкции журнала из кода расширения WatchKit.) Если я установил точку останова в моем приложении iOS, он остановится в этой точке останова, когда это необходимо. Я предполагаю, что отсутствие консольного вывода из NSLog имеет SOMETHING, чтобы связать с запущенным процессом на сим, а не запускать его из Xcode, но я не знаю, что это такое.

(BTW, прикрепляя действием по отношению к контрольной точке, которая вызывает NSLog с точки останова также не отображается, но команда отладчика «журнала сообщений» ДЕЛАЕТ дисплей ли кто-нибудь есть какие-либо идеи.?)

EDIT: Код в приложении iOS, похоже, не имеет значения. В моем случае, это была грязь просто IBAction, который был прикреплен к кнопке в приложение раскадровки IOS:

- (IBAction)buttonAction:(UIButton *)sender; 
{ 
    NSLog(@"Button clicked on iPhone"); 
} 

Я могу установить точку останова на этом заявлении NSLog. Отладчик останавливается в этой строке, но я не вижу оператора журнала в консоли отладки.

+1

вы уверены, что компилятор получает это далеко? о, и, пожалуйста, покажите код, который будет полезен. – LinusGeffarth

+0

Линус, я готов. Отладчик разбивается на строку, содержащую NSLog. Дело в том, что оператор журнала не отображается на консоли. –

+0

Вы дважды проверили, что соединение правильное? попробуйте использовать 'id' вместо' UIButton', может быть, это помогает – LinusGeffarth

ответ

13

Я могу воспроизвести это с помощью простого тестового приложения sans WatchKit. Приложение состоит из NSTimer, который печатает «Таймер уволен» каждую секунду. (Этот код на 100% правильный;). Ничего не отображается в журнале после того, как я вручную привязал процесс.
Насколько я знаю, NSLog выводит на stderr, я предполагаю, что отладчик не перенаправляет stderr на терминал Xcode.

Если вы используете консольное приложение или терминал для просмотра своих журналов, вы можете это сделать. iOS8 хранит журналы моделирования в ~/Library/Logs/CoreSimulator/<Device-UUID>. В этом каталоге вы найдете system.log, который содержит все ваши NSLog.

Вы можете посмотреть на нем в терминале (cat, grep, tail) или открыть его на консоли Console.app.

enter image description here


Apple, подтверждает, что (по крайней мере, для GDB) в Technical Note TN2239: iOS Debugging Magic.

Консоль вывода

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

  • Если запустить приложение GUI, как он будет запущен нормальной пользователя, система перенаправляет любые сообщения, напечатанные на STDERR в журнал системы. Вы можете просмотреть эти сообщения, используя описанные выше методы .
  • Если вы запустите программу из Xcode, вы можете увидеть ее вывод stderr в окне консоли отладчика Xcode (выберите пункт меню Консоль из меню «Выполнить», чтобы увидеть это окно).

Подключение к запущенной программе (с помощью Xcode-х Присоединить к процессу меню, или прикрепить команды в GDB) не подключаются автоматически STDERR программы для окна GDB. Вы можете сделать это изнутри GDB, используя трюк , описанный в разделе «Просмотр stdout и stderr After Attaching» в разделе Техническая нота TN2030, «GDB для ветеранов MacsBug».

Указанные TN2030 больше не доступны на вашем сервере (mirror). Он показал, как можно перенаправить stdout и stderr в консоль Xcode. Однако, поскольку shell tty не является допустимой командой для LLDB, это не поможет. Но, возможно, есть другой способ получить доступ к консоли консоли tty Xcodes, поэтому я присоединяю важную часть этого TN.

Видя стандартный вывод и стандартный поток ошибок После Прикрепление

Если присоединить GDB к процессу (в отличие от начала процесса изнутри GDB), вы не сможете ничего увидеть, что процесс печатает на stdout или stderr. Программы, запущенные Finder, обычно имеют stdout и stderr, подключенные к «/ dev/console», поэтому информация, которую они печатают, отправляется на консоль. Вы можете просмотреть это, запустив консольное приложение (в папке «Утилиты»), однако неудобно смотреть в отдельном окне. Другой альтернативой является подключение выходного сигнала процесса или stderr к терминальному устройству для окна терминала GDB. В листинге 9 показано, как это сделать.

Листинг 9. Подключение STDUD и STDERR к терминальному устройству GDB.

(gdb) attach 795 
[... output omitted ...] 
(gdb) call (void) DebugPrintMenuList() 
No output)-: 

Close the stdout and stderr file descriptors. 
(gdb) call (void) close(1) 
(gdb) call (void) close(2) 

Determine the name of the terminal device for GDB itself. 
(gdb) shell tty 
/dev/ttyp1 

Reopen stdout and stderr, but connected to GDB's terminal. 
The function results should be 1 and 2; if not, something 
is horribly wrong. 
(gdb) call (int) open("/dev/ttyp1", 2, 0) 
$1 = 1 
(gdb) call (int) open("/dev/ttyp1", 2, 0) 
$2 = 2 

Try the DebugPrintMenuList again. 
(gdb) call (void) DebugPrintMenuList() 
Yay output! 
Index MenuRef  ID Title 
----- ---------- ---- ----- 
<regular menus> 
00001 0x767725D3 -21629 Ed 
00002 0x76772627 1128 <Apple> 
00003 0x767726CF 1129 File 
00004 0x76772567 1130 Edit 
[... remaining output omitted ...] 
+1

Я «хорошо» смотрю на мой выход журнала в консоли, если нужно, но это отстой. Консоль очень шумная. Системные процессы постоянно публикуют сообщения, которые для меня бессмысленны. Кроме того, для этого разработана консоль отладки Xcode. Он должен показывать вывод из текущей программы. Запуск приложений - это многоступенчатый процесс: приложение «Kill watch», приложение iOS, создание и запуск приложения iOS, его запуск, запуск приложения для запуска, запуск приложения iOS в симу, приложение отладчика для приложения iOS. По правде говоря, это боль. –

+0

Я надеюсь, что это лучшее решение. Если нет, я приму свой ответ ... –

+0

MacsBug?!? О, человек, который возвращается в Путь ЛУКООННА. Это было тогда, когда Mac использовали 68000 семейных процессоров. Я использовал MacsBug на своем Mac II в конце 80-х и 90-х. –

4

С Xcode версии 7.2 и прошивкой 9.2 и т.д., я нашел следующие работы:

0) Уничтожить как приложение телефона и смотреть приложения
1) Выберите часы Extension Target и нажмите Cmd + R (построить и запустить)
2) Выберите цель телефона и нажмите Ctrl + Cmd +R (Run без здания)

в моем случае, я как приложения в своих тренажерах и получить NSLog OUTP ut для обоих. Мне не нужно прикладываться отдельно. Надеюсь это поможет.

+0

Я должен попробовать. Спасибо за публикацию на довольно старой теме. –

+2

, когда я это делаю, он останавливает мое приложение для наблюдения, а часы идут на главный экран. – Saviz

0

В моем случае набор автоматически видеть NSLog, прежде чем не показывать на всех

enter image description here

3

https://developer.apple.com/library/ios/qa/qa1747/_index.html

1) Подключите устройство и откройте Xcode

2) Выберите «Окно» -> «Устройства» в строке меню.

3) В разделе «УСТРОЙСТВА» в левом столбце выберите de вице-

4) Для того, чтобы увидеть консоль устройства, нажмите вверх-треугольник в левой нижней части правой панели

5) Нажмите на стрелку вниз в правом нижнем углу, чтобы сохранить консоль в виде файла

0

Когда Provisioning профиль устанавливается в AdHoc или распределения, то Xcode оленья кожа шоу журнал, необходимо установить развитие для просмотра войти

5

чтобы добавить на Filipp Keks ответ, вот визуальное представление гораздо более простой способ сделать это, чем принятый ответ.

От ответа Филиппом Кекс в: «1) Подключите устройство и откройте Xcode

2) Выберите Window -> Устройства в строке меню

3) В разделе Устройства в левой колонке, выбрать устройство

4) для того, чтобы увидеть консоль устройства, нажмите вверх-треугольник в левой нижней части правой панели

5) нажмите на стрелку вниз в правом нижнем углу, чтобы сохранить консоль в виде файла "

Этот скриншот был снят в Xcode 7.3.1 в окне Devices.

enter image description here

+0

Я приступаю к работе так же, как и для Xcode 8.3.3. Нужно помнить, что это полный журнал отладки, поэтому все приложения и службы появляются там, и вам нужно будет найти их из своего процесса. – sunsetjunks

+0

Ну «проще», если бы вы могли ** фильтровать ** эти журналы ... но ATM (xcode 9.2) вы не можете ничего сделать с этим пользовательским интерфейсом. (по крайней мере, в живом сеансе). В любом случае я нашел проект github [deviceconsole] (https://github.com/onezens/deviceconsole), который делает то же самое в оболочке, что позволяет вам фильтровать, как и должно быть (немного нестабильно, получило несколько сбоев :() Есть ли кто-нибудь, кто знает для этого лучший проект? – itMaxence

Смежные вопросы