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

时间:2011-09-28 01:14:41

标签: iphone ios stderr

我正在回答here中的建议,将iOS设备上的NSLog输出重定向到文件,效果很好。问题是它不再出现在设备的控制台中。我真正喜欢的是一种将stderr流传输到控制台和文件的方法。有谁知道怎么做?

3 个答案:

答案 0 :(得分:9)

我在另一个帖子(NSLog() to both console and file)上找到了可接受的答案。

提供的解决方案只有在未检测到调试器时才会重定向到文件,如下所示:

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

感谢Sailesh的回答。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

或者您可以重定向到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(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()

    {{1}}
  4. 当然,处理TCP套接字需要更多细节。工作源代码可在此处获得: https://github.com/driedler/iOS-TCP-Logger/wiki/About