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

发布于 2024-12-06 20:47:22 字数 216 浏览 0 评论 0原文

我按照此处答案中的建议进行重定向iOS 设备上的 NSLog 输出到文件,效果很好。问题是它不再显示在设备的控制台中。我真正想要的是一种将 stderr 流连接到控制台和文件的方法。有谁知道如何做到这一点?

I'm following the suggestion in the answer here for redirecting NSLog output on an iOS device to a file, which works great. The problem is that it no longer shows up in the console on the device. What I'd really like is a way to tee the stderr stream to both the console and the file. Does anyone have an idea how to do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

丢了幸福的猪 2024-12-13 20:47:22

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

那里提供的解决方案是仅在未检测到调试器的情况下重定向到文件,如下所示:

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

感谢 Sailesh 的回答。

I found an acceptable answer on another thread (NSLog() to both console and file).

The solution provided there is to only redirect to a file if a debugger is not detected, like this:

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

Thanks to Sailesh for that answer.

无敌元气妹 2024-12-13 20:47:22

一旦freopen()文件描述符,您就可以从中读取数据并按照您的意愿处理数据。 本文中的一些想法将对您有用。

您可以将其写回到标准输出,或者尝试直接写入 /dev/console。我从未尝试过在 iPhone 上打开 /dev/console,但我猜尽管在沙箱之外,但还是有可能的。我不确定应用程序审核流程将如何处理它。

Once you freopen() the file descriptor, you can read from it and do as you please with the data. Some ideas from this will be useful to you.

You could either write it back out to stdout, or try to write directly to /dev/console. I've never tried to open /dev/console on an iPhone, but I'm guessing it's possible despite being outside of the sandbox. I'm not sure how the app review process will treat it.

美胚控场 2024-12-13 20:47:22

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

基本上:

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

    void tcpLogg_log(NSString* fmt, ...)
    {
        va_list 参数;
        va_start(参数,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 日期]];
      NSString *msg = [[NSString alloc] initWithFormat:fmt 参数: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:数据 
                              超时:NETWORK_CLIENT_TIMEOUT_PERIOD 
                              标签:0];                                                
    }
    

    }

  3. 然后在您的 .pch 文件中,添加以下行来覆盖 NSLog()

    定义 NSLog(...) tcpLogg_log(__VA_ARGS__); 
    无效 tcpLogg_log(NSString* fmt, ...);
    

当然,需要更多详细信息来处理 TCP 套接字。工作源代码可在此处获取:
https://github.com/driedler/iOS-TCP-Logger/wiki/About

Or you can redirect to a TCP socket and view on a remote telnet client. No need for XCode this way!

Basically:

  1. Create a standard C function which calls an Obj-C static method:

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

    (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. Then in your .pch file, add the following lines to override NSLog()

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

Of course more details are required to handle the TCP Socket. Working source code is available here:
https://github.com/driedler/iOS-TCP-Logger/wiki/About

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文