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的主要内容,如果未能解决你的问题,请参考以下文章

JVM 啥时候开始忽略堆栈跟踪?

没有错误或堆栈跟踪的 iOS 崩溃

如何清除背压事件的活动堆栈跟踪?

了解 google play 给出的 ANR 堆栈跟踪

从堆栈跟踪中获取更多详细信息

NodeJS 6:如何查看整个错误堆栈跟踪? [复制]