2011-09-28 13 views
9

Podążam za sugestią w odpowiedzi here przekierowania wyjścia NSLog na urządzeniu z systemem iOS do pliku, który działa świetnie. Problem polega na tym, że nie pojawia się już w konsoli na urządzeniu. To, co bardzo bym chciał, to sposób na przeniesienie strumienia stderr zarówno do konsoli, jak i do pliku. Czy ktoś ma pomysł, jak to zrobić?Napisz stderr na iPhone do pliku i konsoli

+0

możliwy duplikat [NSLog() do konsoli i pliku] (http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu

Odpowiedz

8

Znalazłem akceptowalną odpowiedź na inny wątek (NSLog() to both console and file).

rozwiązanie pod warunkiem, że jest tylko przekierować do pliku, jeśli nie zostanie wykryty debugger, tak:

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

Dzięki Sailesh za tę odpowiedź.

+0

gdzie powinniśmy napisać to, jeśli oświadczenie? W delegacie aplikacji czy musimy napisać to w każdym kontrolerze widoku? – Max

+0

Powinieneś napisać to, jeśli chcesz zawrzeć kod, który przekierowuje stderr do pliku. –

1

Po uzyskaniu freopen() deskryptora pliku, możesz go odczytać i wykonać, jak chcesz z danymi. Niektóre pomysły z this przydadzą ci się.

Możesz napisać go z powrotem na standardowe wyjście lub spróbować napisać bezpośrednio pod numerem /dev/console. Nigdy nie próbowałem otworzyć /dev/console na iPhonie, ale domyślam się, że jest to możliwe, mimo że znajduje się poza piaskownicą. Nie wiem, jak potraktuje to proces oceny aplikacji.

1

Możesz też przekierować do gniazda TCP i wyświetlić na zdalnym kliencie telnet. Nie potrzebujesz XCode w ten sposób!

zasadniczo:

  1. utworzenia standardowej funkcji C, który wywołuje obj-C metodą statyczną:

     
    void tcpLogg_log(NSString* fmt, ...) 
    { 
        va_list args; 
        va_start(args, fmt); 
        [TCPLogger tcpLog:fmt :args]; 
        va_end(args); 
    } 
    
  2. metoda statyczna 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. Następnie w pliku .pch dodaj następujące linie zastąpić NSLog()

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

Oczywiście więcej szczegółów są wymagane do obsługi gniazda TCP. Działający kod źródłowy jest dostępny tutaj: https://github.com/driedler/iOS-TCP-Logger/wiki/About