将iPhone上的stderr写入文件和控制台
我在这里的答案中遵循了将iOS设备上的NSLog输出重定向到文件的建议,这非常有效。 问题是它不再出现在设备的控制台中。 我真正喜欢的是一种将stderr流发送到控制台和文件的方法。 有谁知道怎么做?
我在另一个线程( 控制台和文件的NSLog())上找到了可接受的答案。
如果没有检测到调试器,那么提供的解决方案只能重定向到文件,如下所示:
if (!isatty(STDERR_FILENO)) { // Redirection code }
感谢Sailesh的回答。
一旦freopen()
文件描述符,您可以从中读取并随意使用数据。 这方面的一些想法对您有用。
您可以将其写回stdout,或尝试直接写入/dev/console
。 我从来没有试过在iPhone上打开/dev/console
,但我猜它有可能尽管不在沙盒之外。 我不确定应用审核流程将如何处理它。
或者,您可以重定向到TCP套接字并在远程telnet客户端上查看。 这样就不需要XCode了!
基本上:
-
创建一个调用Obj-C静态方法的标准C函数:
void tcpLogg_log(NSString * fmt,...) { va_list args; va_start(args,fmt); [TCPLogger tcpLog:fmt:args]; va_end用来(参数); }
-
静态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]; }
}
-
然后在.pch文件中,添加以下行以覆盖NSLog()
定义NSLog(...)tcpLogg_log(__ VA_ARGS__); void tcpLogg_log(NSString * fmt,...);
当然,处理TCP套接字需要更多细节。 这里有工作源代码: https : //github.com/driedler/iOS-TCP-Logger/wiki/About