将iPhone上的stderr写入文件和控制台
我按照回答here中的建议将iOS设备上的NSLog输出重定向到文件,效果很好。问题是它不再显示在设备的控制台上。我真正喜欢的是将stderr流开到控制台和文件的方式。有没有人有一个想法如何做到这一点?将iPhone上的stderr写入文件和控制台
我在另一个线程(NSLog() to both console and file)上找到了可以接受的答案。
提供的解决方案有,如果没有检测到调试器只重定向到一个文件,如:
if (!isatty(STDERR_FILENO))
{
// Redirection code
}
感谢Sailesh为这个问题的答案。
我们应该在哪里写这个if语句?在应用程序委托中,还是必须将其写入每个视图控制器? – Max
您应该编写if语句来封装将stderr重定向到文件的代码。 –
一旦你freopen()
的文件描述符,你可以从它读取和做你喜欢的数据。 this的一些想法对你有用。
您可以将其写回标准输出,或尝试直接写入/dev/console
。我从来没有试图在iPhone上打开/dev/console
,但我猜尽管在沙箱外面也是可以的。我不确定应用审核流程如何处理。
或者您可以重定向到TCP套接字并在远程telnet客户端上查看。这种方式不需要XCode!
基本上:
-
创建一个标准的C函数调用一个OBJ-C静态方法:
void tcpLogg_log(NSString* fmt, ...) { va_list args; va_start(args, fmt); [TCPLogger tcpLog:fmt :args]; va_end(args); }
-
静态的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()
define NSLog(...) tcpLogg_log(__VA_ARGS__); void tcpLogg_log(NSString* fmt, ...);
当然需要更多的细节来处理TCP套接字。工作的源代码可以在这里找到: https://github.com/driedler/iOS-TCP-Logger/wiki/About
的
可能重复[的NSLog()到控制台和文件(http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu