使用printf调试真实设备的iOS
在Xcode Organizer中,控制台-我可以读取使用printf调试真实设备的iOS,ios,objective-c,debugging,printf,Ios,Objective C,Debugging,Printf,在Xcode Organizer中,控制台-我可以读取NSLog输出,但不能读取printf()。这是否可以像在模拟器中一样,在真实设备上读取printf()结果?Skippy,printf()是c的输出语句,而不是目标c,因此在真实设备中printf()也不起作用。最简单的解决方案是在项目中全局重载printf函数,并用NSLog输出替换它 int printf(const char * __restrict format, ...) { va_list args; va_s
NSLog
输出,但不能读取printf()
。这是否可以像在模拟器中一样,在真实设备上读取printf()
结果?Skippy,printf()是c的输出语句,而不是目标c,因此在真实设备中printf()也不起作用。最简单的解决方案是在项目中全局重载printf函数,并用NSLog输出替换它
int printf(const char * __restrict format, ...)
{
va_list args;
va_start(args,format);
NSLogv([NSString stringWithUTF8String:format], args) ;
va_end(args);
return 1;
}
您可以运行以下命令以仅打印到设备的控制台:
syslog(LOG_WARNING, "log string");
您还需要#包括明确声明syslog和LOG#u警告,正如Nick Lockwood在上面的评论中所说,printf打印到stdout,而NSLog打印到stderr。您可以使用fprintf打印到stderr(Xcode控制台),而不是使用printf,如下所示:
fprintf(stderr, "This prints to the Xcode debug console");
如果你能解释一下为什么要这样做,也许会有帮助?为什么需要使用printf而不是NSLog()?是因为您使用的库包含printf()语句吗?因为我的代码中最大的部分是C代码。通用版本在windoz、droid、symbian、iOS等环境下运行,printf()在iOS模拟器下工作,在XCode中。Objective-C是C的严格超集,因此printf()非常有效。但是NSLog()在幕后的作用比printf()多,这可能是Skippy遇到问题的原因。我相信问题实际上是printf打印到stdout,而NSLog打印到stderr.Nick,fprintf(stderr,format,args);不能在XCode组织者的控制台下工作。Sohaib,非常感谢。这个解决方案工作得很好,我可以保留所有C代码而不做任何更改:)您可以使用标准日志代码,而不必显式声明它们。我想是的,正如我所说,syslog和log_WARNING在sys/syslog.h中显式声明(include的名称不可见,因为不正确地使用了<和>)在iOS 10上,标准输出被发送到Xcode,因此不再需要系统日志。@Sergei现在在Xcode 9.2上为我工作。请注意,NSLog将一些额外的信息作为前缀添加到输出中。但是,fprintf只记录作为参数传递的内容。fprintf本身也不打印\n。