【发布时间】:2014-06-26 10:18:06
【问题描述】:
我希望 XCode 输出(来自 NSLog() 或其他)自动写入应用程序文件夹中的文件。也就是说,我只想把XCode区的全部内容调试成一个文本文件。
我看到了一些代码 sn-ps,但它们中的每一个都避免显示到 XCode(这是不可接受的)。我只想将调试文本复制到文件中...有没有办法做到这一点?
EDIT 1(在尝试了 Clement 的回答之后):
我得到一个链接器错误:
EDIT 2(我如何实现克莱门特的回答):
我创建了一个名为 LogHelper 的新类:
LogHelper.h:
#define NSLog(args...) _Log(@"DEBUG ", __FILE__,__LINE__,__PRETTY_FUNCTION__,args);
@interface MyCustomLog : NSObject
void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...);
@end
LogHelper.m:
#import "LogHelper.h"
@implementation MyCustomLog : NSObject
void append(NSString *msg){
// get path to Documents/somefile.txt
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myCustomLog.txt"];
// create if needed
if (![[NSFileManager defaultManager] fileExistsAtPath:path]){
fprintf(stderr,"Creating file at %s",[path UTF8String]);
[[NSData data] writeToFile:path atomically:YES];
}
// append
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:path];
[handle truncateFileAtOffset:[handle seekToEndOfFile]];
[handle writeData:[msg dataUsingEncoding:NSUTF8StringEncoding]];
[handle closeFile];
}
void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...) {
va_list ap;
va_start (ap, format);
format = [format stringByAppendingString:@"\n"];
NSString *msg = [[NSString alloc] initWithFormat:[NSString stringWithFormat:@"%@",format] arguments:ap];
va_end (ap);
fprintf(stderr,"%s%50s:%3d - %s",[prefix UTF8String], funcName, lineNumber, [msg UTF8String]);
append(msg);
}
@end
我在myApplication-Prefix.pch 中添加了#import "LogHelper.h"。
EDIT 3(我找到了解决方案):
我设置了一个名为“runningFromXCode”(follow this link to see how to do it) 的环境变量,以在应用从 XCode 运行时保持调试文本显示在控制台中;
-
我把这段代码写进了
application:didFinishLaunchingWithOptions:方法(source):if (getenv("runningFromXCode") == NULL){ NSArray *allPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [allPaths objectAtIndex:0]; NSString *pathForLog = [documentsDirectory stringByAppendingPathComponent:@"log.txt"]; freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); }
【问题讨论】:
-
您希望在调试期间将其写入应用程序包?馊主意;选择其他地方。
-
但无论如何
dup2()可能就是你要找的... -
@trojanfoe 您无法写入应用程序包中的文件。它是只读的,因为捆绑目录是使用 SSL 证书签名的代码
-
@Clement 我在哪里说你可以做到这一点?