Запись stderr на iPhone в файл и консоль
Я следую предложению в ответ здесь для перенаправления вывода NSLog на устройстве iOS в файл, который отлично работает. Проблема в том, что он больше не появляется в консоли на устройстве. Мне бы очень хотелось, чтобы поток stderr был подключен как к консоли, так и к файлу. Кто-нибудь знает, как это сделать?
3 ответов
Я нашел приемлемый ответ в другом потоке (NSLog () для консоли и файла).
решение при условии, что есть только перенаправление в файл, если отладчик не обнаружен, например:
if (!isatty(STDERR_FILENO))
{
// Redirection code
}
спасибо Sailesh за этот ответ.
после freopen()
дескриптор файла, вы можете прочитать от его и сделать по мере того как вы угождаете с данными. Некоторые идеи из этой будет полезной для вас.
вы можете либо написать его обратно в stdout, либо попытаться написать непосредственно в /dev/console
. Я никогда не пытался открыть /dev/console
на iPhone, но я предполагаю, что это возможно, несмотря на то, что вне песочницы. Я не уверен, как процесс обзора приложения будет относиться к нему.
или вы можете перенаправить на TCP-сокет и посмотреть на удаленном клиенте telnet. Нет необходимости в XCode таким образом!
по сути:
-
создайте стандартную функцию C, которая вызывает статический метод Obj-C:
void tcpLogg_log(NSString* fmt, ...) { va_list args; va_start(args, fmt); [TCPLogger tcpLog:fmt :args]; va_end(args); }
-
статический метод Obj-C:
(void)tcpLog:(NSString*)fmt :(va_list)args { NSLogv(fmt, args);
}if(sharedSingleton != nil && sharedSingleton.socket != nil) { NSString *time = [sharedSingleton.dateFormat stringFromDate:[NSDate date]]; NSString *msg = [[NSString alloc] initWithFormat:fmt arguments:args]; mach_port_t tid = pthread_mach_thread_np(pthread_self()); NSString *str = [NSString stringWithFormat:@"%@[%X]: %@\r\n", time, tid, msg]; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; [sharedSingleton.socket writeData:data withTimeout:NETWORK_CLIENT_TIMEOUT_PERIOD tag:0]; }
-
тогда в вашем .PCH файл добавьте следующие строки, чтобы переопределить NSLog()
define NSLog(...) tcpLogg_log(__VA_ARGS__); void tcpLogg_log(NSString* fmt, ...);
конечно больше для обработки сокета TCP требуются подробные сведения. Рабочий исходный код доступен здесь: https://github.com/driedler/iOS-TCP-Logger/wiki/About