将iPhone上的stderr写入文件和控制台

我在这里的答案中遵循了将iOS设备上的NSLog输出重定向到文件的建议,这非常有效。 问题是它不再出现在设备的控制台中。 我真正喜欢的是一种将stderr流发送到控制台和文件的方法。 有谁知道怎么做?

我在另一个线程( 控制台和文件的NSLog())上找到了可接受的答案。

如果没有检测到调试器,那么提供的解决方案只能重定向到文件,如下所示:

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

感谢Sailesh的回答。

一旦freopen()文件描述符,您可以从中读取并随意使用数据。 这方面的一些想法对您有用。

您可以将其写回stdout,或尝试直接写入/dev/console 。 我从来没有试过在iPhone上打开/dev/console ,但我猜它有可能尽管不在沙盒之外。 我不确定应用审核流程将如何处理它。

或者,您可以重定向到TCP套接字并在远程telnet客户端上查看。 这样就不需要XCode了!

基本上:

  1. 创建一个调用Obj-C静态方法的标准C函数:

     void tcpLogg_log(NSString * fmt,...)
     {
         va_list args;
         va_start(args,fmt);
         [TCPLogger tcpLog:fmt:args];
         va_end用来(参数);
     }
    
  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()

    定义NSLog(...)tcpLogg_log(__ VA_ARGS__); 
     void tcpLogg_log(NSString * fmt,...);
    

当然,处理TCP套接字需要更多细节。 这里有工作源代码: https : //github.com/driedler/iOS-TCP-Logger/wiki/About