SIGKill 没有警告或堆栈跟踪与 NSLogv
Posted
技术标签:
【中文标题】SIGKill 没有警告或堆栈跟踪与 NSLogv【英文标题】:SIGKill Without warning or stack trace with NSLogv 【发布时间】:2010-10-19 00:47:20 【问题描述】:我知道这是一个有点含糊的问题,但在调试执行期间,我正在处理的应用程序在没有任何堆栈跟踪或警告的情况下死机,并且在调试控制台中仅显示以下消息:
程序收到信号:“SIGKILL”。
我在 XCode 中设置了 NSZombieEnabled、NSDebugEnabled、MallocStackLoggingNotCompact 和 MallocStackLogging。
我已经运行 Instruments 来检查内存泄漏,但没有报告。
在调试器报告“GDB:中断”后我可以进入的最后一个地方是调用 NSLogv 的这段代码:
+ (void)print:(NSString *)format, ...
va_list args;
va_start(args, format);
// Doesn't seem to go past this line
NSLogv(format, args);
va_end(args);
但是这个方法在整个应用程序中被调用了很多次,直到我使用应用程序足够长的时间后,在任何地方都没有问题。
此后通过调试器显示的堆栈是:
#0 0x02592e07 in ___forwarding___
#1 0x02592cd2 in __forwarding_prep_0___
#2 0x000ce57f in _NSDescriptionWithLocaleFunc
#3 0x0260b00d in __CFStringAppendFormatCore
#4 0x02552f87 in _CFStringCreateWithFormatAndArgumentsAux
#5 0x025da36e in _CFLogvEx
#6 0x0014beb5 in NSLogv
在一遍又一遍地重新测试后,SIGKILL 始终发生在对 NSLogv 的调用中,而在其他任何地方都没有。
我还能打开或设置什么来找出调试器终止应用实例的原因?
【问题讨论】:
您的应用程序是多线程的吗?比如你是用performSelectorInBackground:withObject:
,还是直接用NSThread
?
我在不同的地方使用 NSOperations,并且在应用程序获得 SIGKILL 时,它是在我使用“performSelectorOnMainThread:withObject”从运行循环返回之后。 NSOperation 类传递了最终调用“打印”的对象,但打印发生在主线程上。
基于 NSLogv 的参考文档,我认为它是一个线程安全的函数,我认为我使用它是正确的。 developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
你是为设备还是模拟器构建?
【参考方案1】:
检查格式字符串和提供的参数是否正确,例如格式字符串为@"%f",参数为@"hello",这会崩溃....
【讨论】:
以上是关于SIGKill 没有警告或堆栈跟踪与 NSLogv的主要内容,如果未能解决你的问题,请参考以下文章