Запись stderr на iPhone в файл и консоль

Я следую предложению в ответ здесь для перенаправления вывода NSLog на устройстве iOS в файл, который отлично работает. Проблема в том, что он больше не появляется в консоли на устройстве. Мне бы очень хотелось, чтобы поток stderr был подключен как к консоли, так и к файлу. Кто-нибудь знает, как это сделать?

3 ответов


Я нашел приемлемый ответ в другом потоке (NSLog () для консоли и файла).

решение при условии, что есть только перенаправление в файл, если отладчик не обнаружен, например:

if (!isatty(STDERR_FILENO))
{
    // Redirection code
}

спасибо Sailesh за этот ответ.


после freopen() дескриптор файла, вы можете прочитать от его и сделать по мере того как вы угождаете с данными. Некоторые идеи из этой будет полезной для вас.

вы можете либо написать его обратно в stdout, либо попытаться написать непосредственно в /dev/console. Я никогда не пытался открыть /dev/console на iPhone, но я предполагаю, что это возможно, несмотря на то, что вне песочницы. Я не уверен, как процесс обзора приложения будет относиться к нему.


или вы можете перенаправить на TCP-сокет и посмотреть на удаленном клиенте telnet. Нет необходимости в XCode таким образом!

по сути:

  1. создайте стандартную функцию C, которая вызывает статический метод Obj-C:

    void tcpLogg_log(NSString* fmt, ...)
    {
        va_list args;
        va_start(args, fmt);
        [TCPLogger tcpLog:fmt :args];
        va_end(args);
    }
    
  2. статический метод 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];                                                
    }
    
    }
  3. тогда в вашем .PCH файл добавьте следующие строки, чтобы переопределить NSLog()

    define NSLog(...) tcpLogg_log(__VA_ARGS__); 
    void tcpLogg_log(NSString* fmt, ...);
    

конечно больше для обработки сокета TCP требуются подробные сведения. Рабочий исходный код доступен здесь: https://github.com/driedler/iOS-TCP-Logger/wiki/About