Можно ли перенаправить вывод журнала консоли Xcode на терминал при запуске симулятора iPhone?



Мне не нравится использовать окно вывода консоли Xcode при отладке приложения iPhone в симуляторе (или на устройстве, если на то пошло). Я хотел бы иметь возможность использовать инструментарий Unix и делать такие вещи, как фильтрация выходных данных журнала с помощью grep. Но для этого мне нужно получить Xcode, чтобы отправить вывод журнала для запущенного приложения iPhone на терминал.



Есть ли какой-нибудь способ сделать это?
646   6  

6 ответов:

Не могу сказать, как это будет работать в симуляторе, но перенаправить stdout не так уж сложно. Предположим, вы хотите передать это в свой собственный взгляд:

#include <unistd.h>

stderr->_write = RedirectOutputToView;
stdout->_write = RedirectOutputToView;

И использовать прототип:

int RedirectOutputToView(void *inFD, const char *buffer, int size);

В XCode 6 журналы помещаются здесь: /Users/<username>/Library/Logs/CoreSimulator/<app guid>/system.log. username - это, конечно, имя пользователя вашей системы, а app guid - это то, что XCode генерирует для симулятора.

Самый простой способ определить, что такое приложение guid , это построить приложение для симулятора и посмотреть, какой каталог был изменен в последний раз:

~ ❯❯❯ cd ~/Library/Logs/CoreSimulator
~/L/L/CoreSimulator ❯❯❯ ls -latr
total 64
-rw-r--r--   1 x  staff    519 27 Aug 21:54 iOS Simulator.log
drwxr-xr-x  13 x  staff    442 27 Aug 21:54 D283605A-0BA9-43B3-AB6B-F4858BE6E45E
drwxr-xr-x  15 x  staff    510  8 Oct 03:56 425D8E41-0842-4F2D-BC22-8C3695E350EF

Очевидно, что 425D8E41-0842-4F2D-BC22-8C3695E350EF является последним измененным каталогом, поэтому теперь вы можете сделать tail -f ~/Library/Logs/CoreSimulator/425D8E41-0842-4F2D-BC22-8C3695E350EF/system.log | grep keyword или что-то еще, что вы могли бы сделать хочу сделать с живым бревном.

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

Я удалил проверку симулятора и добавил оператор NSLog непосредственно перед перенаправлением, поэтому консоль XCode выплевывает местоположение файла:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
NSLog(@"redirecting STDERR: %@", logPath);
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

Я думаю, что наиболее надежным решением было бы использовать библиотеку журналов (например, CocoaLumberjack ) и настройте его с любым назначением, которое вам нравится.

Я могу получить вывод устройства в терминале, но не смог одновременно подключить сеанс отладки в xcode (я думаю, потому что терминал имеет отладочное соединение).

Запустите приложение с терминала, используя idevicedebug.

idevicedebug -u <device uuid> run com.myco.apps.myapp

Где com.Мико.приложения.myapp-это идентификатор пакета, который можно увидеть на панели "установленные приложения" в окне устройства.

Я думаю, что idevicedebug устанавливается с ideviceinstaller и может быть выполнен с brew

brew install ideviceinstaller

Но Я рекомендуем поискать ideviceinstaller и libimobiledevice (библиотеку, которую он использует), чтобы быть уверенным.

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

Почему бы не использовать Console.app? Хороший способ просматривать журналы grep, а не окно отладки xCode или терминал. Это часть macOS по умолчанию.

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

Если у вас есть операторы c printf, то следующая Так имеет много полезной информации: получить printf на консоли.приложение

В Xcode 6 это уже делается. Откройте систему.файл журнала, связанный со сборкой симуляторов, которую вы используете в данный момент. Для меня это здесь: / Users / josh.lang / библиотека / журналы / CoreSimulator/3BB4CBFB-5A67-4E93-91B5-78E6E3658A16 / system.log

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

Comments

    Ничего не найдено.