0

我想将日志写入全局默认队列中的文件。它在 iOS 6 中运行良好,但在 iOS 5 中即使块为空也会崩溃。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//fprintf(s_logfp, "[%s] %s\n", [[[NSDate date] hipuClientLogDescription] UTF8String], [log UTF8String]);
});

如果我的代码是这样的,那就没问题了:

logQueue = dispatch_queue_create("com.hipu.clientlog", NULL);
dispatch_async(logQueue, ^{
    fprintf(s_logfp, "[%s] %s\n", [[[NSDate date] hipuClientLogDescription] UTF8String], [log UTF8String]);
});

调用堆栈:

#0  0x01dff0b0 in objc_msgSend ()
#1  0x01dffd40 in objc_retain ()
#2  0x0044a712 in HpWriteLogToDisk at /Users/tanqiyu/Documents/hipu_work/iOS/trunk/HipuClient/HpFoundation/HpFoundation/HpLog.m:60
#3  0x003420b6 in -[HpEngine initWithRootDir:appVersion:] at /Users/tanqiyu/Documents/hipu_work/iOS/trunk/HipuClient/HpEngine/HpEngine/Engine/HpEngine.m:69
#4  0x00341a8d in +[HpEngine initEngineWithRootDir:appVersion:] at /Users/tanqiyu/Documents/hipu_work/iOS/trunk/HipuClient/HpEngine/HpEngine/Engine/HpEngine.m:28
#5  0x0000abcd in -[AppDelegate application:didFinishLaunchingWithOptions:] at /Users/tanqiyu/Documents/hipu_work/iOS/trunk/HipuClient/HipuClient/HipuClient/AppDelegate.m:35
#6  0x00f5a9d6 in -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] ()
#7  0x00f5b8a6 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] ()
#8  0x00f6a743 in -[UIApplication handleEvent:withNewEvent:] ()
#9  0x00f6b1f8 in -[UIApplication sendEvent:] ()
#10 0x00f5eaa9 in _UIApplicationHandleEvent ()
#11 0x02325fa9 in PurpleEventCallback ()
#12 0x021661c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#13 0x020cb022 in __CFRunLoopDoSource1 ()
#14 0x020c990a in __CFRunLoopRun ()
#15 0x020c8db4 in CFRunLoopRunSpecific ()
#16 0x020c8ccb in CFRunLoopRunInMode ()
#17 0x00f5b2a7 in -[UIApplication _run] ()
#18 0x00f5ca9b in UIApplicationMain ()
#19 0x0000a97d in main at 
4

1 回答 1

0

如果它在块中没有代码的情况下崩溃,那么您肯定会破坏内存。

当你解决这个问题时:

1) 确保 slogfp 是全局的并且不会改变。

2) 如果任一字符串为 nil,则尝试使用为 nil 的 char* 时会崩溃。建议您先创建一个 NSString,测试其是否有效,然后再调度它进行日志记录。

于 2013-05-03T11:52:52.440 回答