【问题标题】:SIGKill Without warning or stack trace with NSLogvSIGKill 没有警告或堆栈跟踪与 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/…
  • 你是为设备还是模拟器构建?

标签: iphone objective-c memory


【解决方案1】:

检查格式字符串和提供的参数是否正确,例如格式字符串为@"%f",参数为@"hello",这会崩溃....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多