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