2011-09-28 5 views
9

Sto seguendo il suggerimento nella risposta here per reindirizzare l'output NSLog su un dispositivo iOS su un file, che funziona benissimo. Il problema è che non appare più nella console sul dispositivo. Quello che mi piacerebbe davvero è un modo di collegare lo stream stderr sia alla console che al file. Qualcuno ha un'idea di come farlo?Scrivi stderr su iPhone su file e console

+0

possibile duplicato di [NSLog() su console e file] (http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu

risposta

8

Ho trovato una risposta accettabile su un altro thread (NSLog() to both console and file).

La soluzione a condizione che v'è quella di reindirizzare solo a un file se non viene rilevato un debugger, come questo:

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

Grazie a Sailesh per la sua risposta.

+0

dove dovremmo scrivere questa istruzione if? Nel delegato dell'app o dobbiamo scriverlo in ogni controller di visualizzazione? – Max

+0

Dovresti scrivere questa istruzione if per incapsulare il codice che reindirizza lo stderr in un file. –

1

Una volta che si è freopen() il descrittore di file, è possibile leggere da esso e fare come ti pare con i dati. Alcune idee da this ti saranno utili.

È possibile riscriverlo su stdout oppure provare a scrivere direttamente su /dev/console. Non ho mai provato ad aprire /dev/console su un iPhone, ma suppongo che sia possibile pur essendo al di fuori della sandbox. Non sono sicuro di come verrà trattato il processo di revisione delle app.

1

Oppure è possibile reindirizzare a un socket TCP e visualizzare su un client telnet remoto. Non c'è bisogno di XCode in questo modo!

Fondamentalmente:

  1. Crea una funzione standard C che chiama un metodo statico Obj-C:

     
    void tcpLogg_log(NSString* fmt, ...) 
    { 
        va_list args; 
        va_start(args, fmt); 
        [TCPLogger tcpLog:fmt :args]; 
        va_end(args); 
    } 
    
  2. Il metodo Obj-C statico:

     
    (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. Poi nel file PCH, aggiungere le seguenti righe per ignorare NSLog()

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

Naturalmente maggiori dettagli sono necessari per gestire il Socket TCP. Il codice sorgente di lavoro è disponibile qui: https://github.com/driedler/iOS-TCP-Logger/wiki/About