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
risposta
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.
dove dovremmo scrivere questa istruzione if? Nel delegato dell'app o dobbiamo scriverlo in ogni controller di visualizzazione? – Max
Dovresti scrivere questa istruzione if per incapsulare il codice che reindirizza lo stderr in un file. –
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.
Oppure è possibile reindirizzare a un socket TCP e visualizzare su un client telnet remoto. Non c'è bisogno di XCode in questo modo!
Fondamentalmente:
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); }
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]; }
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
possibile duplicato di [NSLog() su console e file] (http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu